什么是 "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 -1
和select 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 的下一个查询中如何使用这些数据。这可能会回答您的问题。
你问的基本上是贵公司特有的业务规则。真正的答案应该在于原始代码创建的任何需求文档中。你应该去寻找它们并阅读它们。我们可以根据自己的经验进行猜测,但只有贵公司的人才能在这里回答为什么问题。
如果找不到文档,则需要与使用数据的利益相关者交谈(是的,直接交谈,最好是亲自交谈)并了解他们的需求。只有在 运行 代码和分析结果之后才这样做,才能更好地理解返回数据的含义。
我有以下查询,它是常用 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 -1
和select 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 的下一个查询中如何使用这些数据。这可能会回答您的问题。
你问的基本上是贵公司特有的业务规则。真正的答案应该在于原始代码创建的任何需求文档中。你应该去寻找它们并阅读它们。我们可以根据自己的经验进行猜测,但只有贵公司的人才能在这里回答为什么问题。
如果找不到文档,则需要与使用数据的利益相关者交谈(是的,直接交谈,最好是亲自交谈)并了解他们的需求。只有在 运行 代码和分析结果之后才这样做,才能更好地理解返回数据的含义。