2011-11-21 5 views
7

W SQL Server, mam następujący wzór:

enter image description hereSQL: Pierwszy warunek w instrukcji OR w JOIN jest zawsze wykonywany jako pierwszy?

Czy to w 100% pewien, że pierwszy warunek z lub oświadczenie w JOIN będzie pierwszy stracony? Czy następująca instrukcja SQL spowoduje zielony wynik?

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

To będzie w dużym stopniu zależą twoja baza danych. Potężne bazy danych, takie jak Oracle, DB2, SQL Server zoptymalizują (biorąc pod uwagę indeksy, histogramy, ograniczenia itp.). O której bazie danych chodzi? –

+0

To jest SQL Server (zaktualizowane pytanie) –

+0

'a lub b' i' b lub a' oznacza to samo w potrójnej logice boolowskiej. Dlaczego chciałbyś, aby sprzężenie odfiltrowało 'P-A | 100', ponieważ warunek łączenia jest prawdziwy dla wierszy leżących poniżej? – Benoit

Odpowiedz

8

Czy to w 100% pewien, że pierwszy warunek z lub oświadczenie w JOIN będzie pierwszy stracony?

Nie. Nie ma gwarantowanej kolejności oceny, a nawet jeśli tam, gdzie całe wyrażenie byłoby nadal oceniane do tej samej wartości i nie wpłynęłoby na to, które wiersze są dopasowane w złączeniu.

Zapytanie dadzą ten wynik:

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

Chyba szukasz czegoś takiego.

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 

Można spróbować tu zapytań za pomocą SQL Server 2008. http://data.stackexchange.com/stackoverflow/qt/118492/

1

odpowiedź Mikael jest poprawne, ale to zmieniona wersja zapytania jest bardziej zwięzły:

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