MS SQL:如果存在条件,联合如何工作?

时间:2017-08-23 12:14:44

标签: sql sql-server

如果存在,任何人都可以解释工会内部如何运作吗?我的代码如下。

if exists(select top 1 ShoppingCartNo from tbSupplierLineItem 
where BidSummaryDueDate>CONVERT(date,getdate()) and ShoppingCartNo=@SC
union
select top 1 ShoppingCartNo from Protrac_Archieve.dbo.tbSupplierLineItem 
where BidSummaryDueDate>CONVERT(date,getdate()) and ShoppingCartNo=@SC)
begin
SQL statements
end

5 个答案:

答案 0 :(得分:3)

如果子查询的 有一行,union将返回一行。因此,构造等同于:

if (exists (select 1
            from tbSupplierLineItem 
            where BidSummaryDueDate > CONVERT(date, getdate()) and
                  ShoppingCartNo = @SC
           ) or
    exists (select 1
             from Protrac_Archieve.dbo.tbSupplierLineItem 
             where BidSummaryDueDate > CONVERT(date, getdate()) and
                   ShoppingCartNo = @SC
           )
   )
begin
    SQL statements
end;

就个人而言,我认为这个版本更清晰。优化器也应该更容易优化(尽管这可能不是此查询的问题)。

其他说明:

  • EXISTS衡量是否返回任何。行上的值无关紧要(即使它是NULL)。我使用1因为它很容易输入并清楚地指明意图。
  • UNION是一个坏主意,因为它会导致删除重复项的开销。但是,TOP 1几乎完全缓解了这个问题。
  • SELECT TOP子查询中的EXISTS应该是不必要的。 EXISTS在第一行“停止”。

答案 1 :(得分:1)

它与外部if exists的工作方式相同。

if exists检查括号之间的查询是否返回了某些内容。 在这种情况下,结果将是两个select语句的并集。

答案 2 :(得分:1)

我的理解是,构成联合的两个查询都会执行,如果返回任何记录,则EXISTS为true,否则为false。

答案 3 :(得分:1)

请参阅。

IF EXISTS (SELECT 1
 UNION SELECT 2)
 BEGIN
   SELECT 3
 END

输出:3

答案 4 :(得分:0)

首先将if语句中的两个select查询的结果集合并,然后检查这些查询中是否存在任何记录。