如果存在,任何人都可以解释工会内部如何运作吗?我的代码如下。
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
答案 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查询的结果集合并,然后检查这些查询中是否存在任何记录。