什么是“选择-1”,它与“选择1”有什么不同?

时间:2016-12-20 13:48:50

标签: sql db2-luw

我有以下查询,它是公用表表达式的一部分。我不明白“选择-1”语句的功能。它明显不同于“EXISTS”语句中使用的“Select 1”。有什么想法吗?

  select days_old, 
         count(express_cd),
         count(*),  
         case 
           when round(count(express_cd)*100.0/count(*),2) < 1 then '0'      
           else '' 
         end ||
           cast(decimal(round(count(express_cd)*100.0/count(*),2),5,2) as varchar(7)) || 
           '%'   
  from foo.bar   
  group by days_old   
  union all  
  select -1, -- Selecting the -1 here
         count(express_cd),
         count(*),   
         case 
           when round(count(express_cd)*100.0/count(*),2) < 1 then '0' 
           else ''
         end ||
           cast(decimal(round(count(express_cd)*100.0/count(*),2),5,2) as varchar(7)) || 
           '%'  
  from foo.bar   
  where days_old between 1 and 7

4 个答案:

答案 0 :(得分:2)

它只是为返回的每一行选择数字“减1”,就像“select 1”将为返回的每一行选择数字“one”。

顺便说一句,“选择1”语法在EXISTS语句中使用没有什么特别之处;它只是选择一些随机值,因为EXISTS需要返回一条记录而一条记录需要数据;数字1就足够了。

为什么你会这样做,我不知道。

答案 1 :(得分:1)

当你有一个union语句时,union的每个部分都必须包含相同的列。从我看到这个时看到的内容来看,第一个陈述是给你一行每天的价值,然后是每天的一些统计数据。工会的第二部分是给你一个只有一周左右的记录的摘要。由于天老栏与此处不相关,因此他们将假值作为占位符以进行联合。当然,这只是基于多年来阅读数千个查询的猜测。可以肯定的是,我需要实际运行代码。

由于您说这是一个CTE,要真正理解为什么会发生这种情况,您可能需要查看它生成的数据以及在下一个使用CTE的查询中如何使用该数据。这可能会回答你的问题。

您所询问的内容基本上是关于贵公司独有的业务规则。真正的答案应该在于原始代码创建的任何需求文档。你应该去寻找它们并阅读它们。我们可以根据自己的经验做出猜测,但只有贵公司的人才能回答这里的问题。

如果找不到文档,那么您需要与使用数据并了解其需求的利益相关方进行对话(是的,直接对话,最好是亲自交谈)。只有在运行代码并分析结果后才能更好地理解返回数据的含义。

答案 2 :(得分:0)

根据您的查询,所有day_old在1到7之间的记录都将输出为&#39; -1&#39;,这就是select -1所做的,这里没什么特别的,没有什么区别select -1中的select 1exists都会将记录输出为1或-1,它们会做同样的事情来检查是否有任何数据。

回到您的查询,我注意到您有一个union all,并按union all比较您选择连接的每四列,我猜您的任务是获得最终结果,其中days_old不在1之间和7并将结果与​​day_old结合起来,这是因为你在1到7之间取得了所有结果。

答案 3 :(得分:0)

这只是一个分组逻辑。

您的查询返回聚合 数据(计数和舍入)按days_old列加一个组分组,其中days_old在1到7之间。 因此,-1只是另一个附加组,它不能是1,因为days_old = 1是另一个有效组。

结果将是这样的:

row1:days_old = 1 count(*)= 2 ...

row2:days_old = 3 count(*)= 5 ...

row3:days_old = 9 count(*)= 6 ...

row4:days_old = -1 count(*)= 7