选择1做什么?

时间:2016-11-18 00:38:50

标签: sql sql-server

我有一些代码,并希望将其作为一种学习体验。我想问一下选择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

4 个答案:

答案 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_weekfiscalweek中的此行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个条件

  • 如果您需要从表名之类的对象中计算行数,那么它非常有用 返回仅包含1的整个列。
  • 如果在select语句中放入任何where条件,则它将根据您的结果重新调整结果 条件
  • 您只知道select语句会影响多少列。