2017-08-23 37 views
-1

任何人都可以解釋如何存在聯合工作?我的代碼如下。MS SQL:如果工會內部工作如果存在條件?

if exists(select top 1 ShoppingCartNo from tbSupplierLineItem 
where BidSummaryDueDate>CONVERT(date,getdate()) and [email protected] 
union 
select top 1 ShoppingCartNo from Protrac_Archieve.dbo.tbSupplierLineItem 
where BidSummaryDueDate>CONVERT(date,getdate()) and [email protected]) 
begin 
SQL statements 
end 
+6

它的工作方式與沒有if if一樣 – Jens

+1

基本上用不同的方法寫if if exists()或exists()begin; ...'儘管我認爲'union'應該是'union all'以避免排序操作符(除非已經通過在exists()中進行了優化) – SqlZim

+1

爲什麼你認爲它可以工作在這方面? –

回答

1

它的工作原理一樣外if exists

if exists檢查圓括號之間的查詢是否返回某些內容。 在這種情況下,結果將是您的兩個select語句的聯合。

1

我的理解是構成聯合的兩個查詢都會執行,並且如果返回ANY記錄,則EXISTS爲true,否則爲false。

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幾乎可以完全緩解這個問題。
  • EXISTS子查詢中的SELECT TOP應該是不必要的。 EXISTS「停止」在第一行。
+0

綜合說明; +1 – SqlZim

1

查看。

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

OUTPUT:3

0

它首先結合的結果集內的兩個選擇查詢是否存在語句,然後檢查來自這些查詢的任何記錄的存在。