我有一些代码,并希望将其作为一种学习体验。我想问一下选择1的作用是什么?
前5行看起来有人正在使用日历功能来获取年,财政季度,财政周,然后提取记录(如果它们存在于表中)。我不确定你会得到什么,除了你得到年,季度和周信息和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
答案 0 :(得分:9)
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
匹配,并且还具有从该calendar_date_dateadd
函数返回的'true'值(或者是拼写错误,更有可能的是,cw.calendar_Date
与原生DateAdd
函数的结果之间存在一些比较。
如果该查询返回任何行,则exists
返回true
,并将该行添加到结果集中。如果它没有返回任何行,则exists
将返回false
,并且该行不会添加到结果集中。
现在,您会注意到此处没有1
的讨论。那是因为它无关紧要。看看documentation of EXISTS;它只是说:
如果子查询包含任何行,则返回TRUE。
所以你选择什么并不重要。这与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
你得到了什么?可能很多1s。 (如果top 1000
很大,可能会在其中放置dim_Date
或其他内容。但实际上,如果您对dim_date
进行了行计数,并计算了这些行数1
,你得到相同的数字(如果一切正常运行)。
答案 1 :(得分:2)
SELECT 1
只返回1
,这只是一个常量,所以查询返回一些内容而EXISTS
返回true。
你可以使用任何东西。 1
只是常见的,因为它是一个非常快的。
答案 2 :(得分:0)
SELECT 1返回1.并且行数等于查询返回的行数。
答案 3 :(得分:0)
从表名中选择1个条件