什么是 "Select -1",它与 "Select 1" 有何不同?

What is "Select -1", and how is it different from "Select 1"?

我有以下查询,它是常用 table 表达式的一部分。我不明白 "Select -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

它只是 select 返回每一行的数字 "minus one",就像 "select 1" 将 select 返回每一行的数字 "one" 一样。

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

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

根据你的查询,所有days_old在1到7之间的记录都将输出为'-1',这就是select -1所做的,这里没有什么特别的,没有区别在exists中的select -1select 1之间,两者都会将记录输出为1或-1,他们正在做同样的事情来检查是否有任何数据。

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

这只是一个分组逻辑。

您的查询 returns 已汇总 数据(计数和轮数)按 days_old 列分组 再加上一组 数据,其中 days_old 介于 1 和 7 之间。 所以,-1 只是那里的另一个附加组,它不能是 1,因为 days_old=1 是另一个有效组。

结果会是这样的:

第 1 行:days_old=1 计数(*)=2 ...

行 2:days_old=3 计数 (*)=5 ...

第 3 行:days_old=9 计数 (*)=6 ...

第 4 行:days_old=-1 计数(*)=7

当你有联合声明时,联合的每一部分都必须包含相同的列。从我看这篇文章时读到的内容来看,第一个语句是为您提供每一天的旧值一行,然后为每一天的旧值提供一些统计数据。 union 的第二部分是为您提供仅一周左右的所有记录的摘要。由于 days old 列在这里不相关,他们放入一个假值作为占位符以进行联合。当然,这只是基于多年来阅读数以千计的查询的猜测。可以肯定的是,我实际上需要 运行 代码。

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

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

如果找不到文档,则需要与使用数据的利益相关者交谈(是的,直接交谈,最好是亲自交谈)并了解他们的需求。只有在 运行 代码和分析结果之后才这样做,才能更好地理解返回数据的含义。