Bedingte INNER JOIN in SQL Server
Ich habe eine ziemlich komplexe Abfrage, die ziemlich viel imitiert eine test-Abfrage, die ich weiter unten:
SELECT C.*
FROM Customer C
INNER JOIN CustDetail CD ON C.CustomerId = CD.CustomerId
INNER JOIN Address A ON CD.DetailID = A.DetailID
INNER JOIN Group G ON C.CustomerId = G.CustomerId --Join only when C.code = 1
INNER JOIN GroupDetail D ON G.GroupId = D.DetailId --Join only when C.code = 1
WHERE G.Active = 1 AND --Only when C.code = 1
D.code = '1' AND --Only when C.code = 1
C.Id = @customerId
Ich würde gerne INNER JOIN
s auf Group G
und GroupDetail D
(und natürlich nicht in der WHERE
Bedingungen auf der Grundlage der Tabelle Spalte C.code = 1
Ersetzte ich die INNER JOIN
s mit LEFT OUTER JOIN
s für beide die join-Bedingungen, aber das Ergebnis ist nicht das, was erwartet wurde
Wie kann ich bedingt zu tun, die JOIN -
- Wie wäre
INNER JOIN Group G ON C.CustomerId = G.CustomerId AND C.code = 1
? - Könnte Sie post ein paar Beispiel-Daten, die gewünschten Ergebnisse, und wie die Ergebnismenge, die Sie bekam mit der linken verbindet, war "nicht das, was erwartet wurde"? Zu wissen, was erwartet wurde, kann es eine ganze Menge einfacher zu helfen, Ihr problem zu lösen.
- Wie viele codes kann ein Kunde haben, fragt er Sie, natürlich vorausgesetzt, der Kunde.ID ist einzigartig in der Kunden-Tabelle? wenn Sie nur wollen, zu tun teh beitreten, wenn code =1, aber egal, wenn es nicht ist, dann eine union wäre der Weg, den ich gehen würde.
- Ich habe versucht zu vermeiden, tun die
UNION
aber wie es klingt, ist unvermeidlich. Um Ihre Frage zu beantworten, kann der Kunde einen code von 0 oder 1. Wenn ich einenC.code = 1
in der join-Bedingung, wird es ignorieren, es fürC.code = 0
? - Ich hatte einen kleinen Verdacht, sieht aus wie @Andew hat Ihnen die nächste Antwort auf das, was Sie wollen. Angesichts Kunde kann 0 oder 1 sein, es wird besser funktionieren, für einen Kunden, denke ich. Ich glaube, ich würde Blick auf eine Normalisierung und eine CodeZeroCustomers und ein CodeOneCustomers Tabelle in Ihrer position. Vielleicht gibt es einige andere Daten, die nur für die eine oder die andere könnten Sie split als gut. Zwei value-index versus table scan, kein schönes Bild....
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich vermute, Sie enthält nicht die NULL-Prüfungen vor, so dass Sie nie zu sehen bekam Zeilen, in denen C. code <> 1 ?
Sollten Sie überprüfen, von NULL auf ein Feld, das wird nie null sein. Dies ist fast immer die 'id', aber es ist nicht klar, dass Sie noch eine G.-id oder eine D.-id.
Ich bin zu raten, was Sie wollen, ist nur eine engere ON-Klausel, und einer zusammengesetzten Bedingung.
Diese machen einen semi-join nur, wenn der code 1.