gpt4 book ai didi

sql - 选择 1 有什么作用?

转载 作者:行者123 更新时间:2023-12-04 21:27:09 27 4
gpt4 key购买 nike

我有一些代码,希望让它成为一种学习体验。我想问一下select 1是做什么的?

前 5 行看起来像是有人在使用日历函数来获取年、财政季度、财政周,然后提取表中存在的记录。我不确定除了获得年、季度和周信息以及 select 1 内部查询发现某些内容的 1 列之外,您还会得到什么。有人可以帮助我解释返回的内容吗?先感谢您。哦,我应该注意到日历函数可能被用来截断使用日历函数返回的额外数据。有人可能只想要像 2016 年 6 月 1 日这样的内容,而不是显示的分钟和秒数。

这是代码片段:

select calendar, fiscal_yr, fiscal_qtr, fiscal_week from dim_date_weeks
Where exists (select 1 from dim_date cw
where cw.calendar_date_Dateadd(dd, datediff(dd, 0, getdate()), 0)
and weeks.fin_qtr=cq.fin_qtr
and weeks.fiscalweek= cw.fiscal_week
)
union
select dlw.calendar_date, dlw.fiscalyr, dlw.fin_qtr,fiscal_week from dim_date dlw join
(select top 1 lw.fiscal_yr, lw.fin_qtr, fiscal_week from dim_date lw
where lw.calendar=date < (select min(calendar_date)from dim_date_weeks
where exists (select 1 from dim_date cw
where date_Dateadd(dd, datediff(dd, 0, getdate()), 0)
and weeks.fin_qtr=cq.fin_qtr
and weeks.fiscalweek= cw.fiscal_week
)
)
order by lw.calendar_date desc

最佳答案

当然,SELECT 1 只选择 1。在这种情况下,它用于测试是否存在与条件匹配的任何行:如果存在与 WHERE 子句匹配的行,则返回 1,否则不返回任何内容。

这是 WHERE EXISTS 子句中的常见构造,因为除了行存在的字面事实之外,您真的不想返回任何内容。

更详细地查看这个,让我们确切地展示正在发生的事情。

让我们只看第一部分,第二部分足够相似以至于无关紧要。所以你的查询是:

select calendar, fiscal_yr, fiscal_qtr, fiscal_week 
from dim_date_weeks
where exists
(select 1
from dim_date cw
where cw.calendar_date_Dateadd(dd, datediff(dd, 0, getdate()), 0)
and weeks.fin_qtr=cq.fin_qtr
and weeks.fiscalweek= cw.fiscal_week
)

撇开 weeks 未定义的细节,我们假设它确实是 dim_date_weeks :

首先,这是从 dim_date_Weeks 中选择行。

然后,对于 dim_date_weeks 中的每一行,它正在查询 dim_date ,并查找所有具有与 fin_qtr 中该行的 fin_Qtr 匹配的 weeks 的行,以及与 fiscal_week 中该行的 fiscalweek 匹配的 weeks 的所有行,并且还返回了“true来自该 calendar_date_dateadd 函数(或者那是一个错字,更有可能,并且在 cw.calendar_Date 和 native DateAdd 函数的结果之间有一些比较)。

如果该查询返回任何行,则 exists 返回 true ,并将该行添加到结果集中。如果它不返回任何行,则 exists 返回 false 并且该行不会添加到结果集中。

现在,您会注意到这里没有讨论 1。那是因为它无关紧要。看看 documentation of EXISTS ;它说的是:

Returns TRUE if a subquery contains any rows.



所以你选择什么并不重要。这不像 select count() 如果列可以为空并且包含空值,那么它在括号内的内容很重要;在这里,重要的是行。所以作者遵循了一种风格选择,将 1 放在那里。其他人(如 SQL Server 文档)可能会将 select * 放在那里。实际上,您可以选择任何合法的选择。它实际上不会将这些数据放在任何地方;来自内部 EXISTS 查询的任何信息都没有放在结果集中。只是事实是真还是假。

最终,这与在原始 inner join 表和 from 内部查询之间执行 exists 基本相同,只是不从中选择任何内容。因此,如果 cw 每个 weeks 行仅返回一行(如果它们具有一对一的关系),则以下内容或多或少会返回相同的内容:
select weeks.calendar, weeks.fiscal_yr, weeks.fiscal_qtr, weeks.fiscal_week
from dim_date_weeks weeks
inner join
(select 1
from dim_date
where calendar_date_Dateadd(...)
) cw
on cw.fin_qtr=weeks.fin_qtr
and cw.fiscal_week=weeks.fiscalweek

如果他们没有一对一的关系,或者多对一的关系,其中 cw 是一个,那么这不会返回相同的东西,这可能就是为什么首先完成 exists 查询的原因。但是你明白了。

请注意,我也将 1 放在那里,但也可以轻松地放置 *fin_Qtr 或任何其他合法的返回值。您总是可以返回一个常量,在这种情况下,毕竟每个有效行都会返回一个常量。

让我们实际看看它的实际效果,只是为了好玩。假设这不是一个会介意对其进行轻率查询的服务器,请运行以下命令:
select 1
from dim_date

你得到了什么?很多 1,可能。 (如果 top 1000 很大,则将 dim_Date 或其他内容放入其中可能是个好主意。)事实上,如果您对 dim_date 进行了行数计数,并且对这些 1 进行了计数,您将得到相同的数字(如果一切正常)。

关于sql - 选择 1 有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40667556/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com