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 JOINs 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 JOINs mit LEFT OUTER JOINs 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 einen C.code = 1 in der join-Bedingung, wird es ignorieren, es für C.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....
InformationsquelleAutor Nick | 2012-02-06
Schreibe einen Kommentar