2012-04-11 6 views
2

Ich versuche, Daten aus RepDailyInfo Tisch, wenn die RepDailyCollection.IsReceived = 0 und zu erhalten, wenn die RepDailyCollection hat einen Rekord für diese bestimmten RepDailyInfoID. Ist das in SQL Server 2005 möglich?Return Reihen, auch wenn Datensatz nicht existiert, wenn linke Outer-Join verwendet

Select distinct RepDailyInfo.Date 
from RepDailyInfo 
left outer join RepDailyCollection c 
    on c.RepDailyInfoID = RepDailyInfo.RepDailyInfoID 
where c.IsReceived = 0 
    or c.IsReceived = null 

Antwort

1

bewegen sich die Bedingungen in den ON Klausel der beitreten, denn sonst müssen Sie die Verbindung zu finden eine Zeile für die Zeile in der WHERE Klausel genannt werden:

Select distinct RepDailyInfo.Date 
from RepDailyInfo 
left outer join RepDailyCollection c 
    on c.RepDailyInfoID = RepDailyInfo.RepDailyInfoID 
    and (c.IsReceived = 0 or c.IsReceived is null) 

auch die Verwendung von Klammern um die or beachten, die in SQL benötigt, da „oder“ Vorrang vor „und“ und ohne Klammern führt am Ende mit "(A und B) oder C"

+0

Vielen Dank! Ich weiß nicht, dass ich in Outer Join schreiben und konditionieren kann. Interessant zu wissen. Danke noch einmal!! :-) – Ram

+1

Kein Problem. Eigentlich ist diese Technik sehr praktisch und es ist etwas, was der Winterschlaf nicht machen kann, was man sich merken sollte, wenn man jemals versucht, HQL-Abfragen dieser Art zu schreiben - man muss eine native SQL-Abfrage anstelle einer HWL-Abfrage verwenden. – Bohemian

+1

@ram Ich glaube, dass 'c.IsReceived = null 'sollte' c.IsReceived ist null' sein. –

0

Ja tun, aber Sie haben rechte Seite kommen mitmachen selbst filtern:

Select distinct RepDailyInfo.Date 
from RepDailyInfo 
left outer join RepDailyCollection c 
    on c.RepDailyInfoID = RepDailyInfo.RepDailyInfoID 
    and (c.IsReceived = 0 
    or c.IsReceived is null) 
0

Die WHERE Klausel filtert nach der OUTER JOIN. Wenn Sie nicht, dass das Verhalten wollen, bewegen Sie den WHERE Klausel in die ON Klausel des JOIN, wie folgt aus:

select distinct r.date 
from RepDailyInfo r 
left outer join RepDailyCollection c on c.RepDailyInfoID = r.RepDailyInfoID 
    and isnull(c.IsReceived, 0) = 0 
Verwandte Themen