2011-11-21 38 views
7

在SQL Server中,我下面的設計:

enter image description hereSQL:JOIN中OR語句中的第一個條件總是首先執行?

是不是100%肯定是從OR語句聯接將首先執行的第一個條件?所以下面的SQL語句會導致綠色結果?

SELECT P.Name, D.Percentage 
FROM Personnel P 
JOIN Department D ON 
    P.Dep_Code = D.Code AND 
    (P.SubDep_Code = D.SubCode OR D.SubCode = '*') 
+2

這將在很大程度上取決於你的數據庫。強大的數據庫,如Oracle,DB2,SQL Server將會優化(考慮索引,直方圖,約束等)。這是關於什麼數據庫? –

+0

它是SQL Server(更新的問題) –

+0

'a或b'和'b或a'表示三元布爾邏輯中的相同。你爲什麼想要加入過濾掉'P-A | 100',因爲連接條件對於下面的行是正確的? – Benoit

回答

8

是可以肯定的,從OR語句在 的首要條件JOIN將首先執行100%?

不。沒有確定的評估順序,即使整個表達式仍然評估爲相同的值,並且不會影響連接中匹配的行。

您的查詢將會給這個結果:

Name  Percentage 
---------- ----------- 
P-A  100 
P-A  20 
P-A  80 
P-B  100 

我猜你正在尋找這樣的事情。

select P.Name, 
     coalesce(D1.Percentage, D2.Percentage) as Percentage 
from Personnel as P 
    left outer join Department as D1 
    on P.Dep_Code = D1.Code and 
     P.SubDep_Code = D1.SubCode 
    left outer join Department as D2 
    on P.Dep_Code = D2.Code and 
     D2.SubCode = '*' 
where coalesce(D1.Percentage, D2.Percentage) is not null 

你可以試試這裏的查詢中使用SQL Server 2008的http://data.stackexchange.com/stackoverflow/qt/118492/

1

的Mikael的答案是正確的,但查詢的這個修訂版更加簡潔:

SELECT P.Name, D.Percentage 
FROM Personnel P 
JOIN Department D 
ON P.Dep_Code = D.Code AND COALESCE(P.SubDep_Code,'*') = D.SubCode 
相關問題