Probleme mit INNER JOIN und LEFT/RIGHT OUTER JOIN

Ich habe drei Tabellen:

  • Bestellungen
    • OrderId, int PK
    • CustomerId, int FK zu Kunden, NULL erlaubt

  • Kunden
    • CustomerId, int PK
    • CompanyId, int FK zu Unternehmen, NULL ist nicht erlaubt

  • Unternehmen
    • CompanyId, int PK
    • Name nvarchar(50)

Möchte ich wählen Sie alle Aufträge, egal ob Sie ein Kunde oder nicht, und wenn Sie Kunden haben dann auch die Kunden der Firma.

Wenn ich diese Abfrage verwenden...

SELECT Orders.OrderId, Customers.CustomerId, Companies.Name
FROM   Orders
       LEFT OUTER JOIN Customers
           ON Orders.CustomerId = Customers.CustomerId
       INNER JOIN Companies
           OM Customers.CompanyId = Companies.CompanyId

...es gibt nur die Aufträge eines Kunden. Wenn ich ersetzen INNER JOIN durch LEFT OUTER JOIN...

SELECT Orders.OrderId, Customers.CustomerId, Companies.Name
FROM   Orders
       LEFT OUTER JOIN Customers
           ON Orders.CustomerId = Customers.CustomerId
       LEFT OUTER JOIN Companies
           OM Customers.CompanyId = Companies.CompanyId

...es funktioniert, aber ich verstehe nicht, warum dies notwendig ist, weil die Beziehung zwischen Customers und Companies erforderlich ist: Ein Kunde muss ein Unternehmen haben.

Einen alternativen Ansatz, der funktioniert so gut zu sein scheint:

SELECT Orders.OrderId, Customers.CustomerId, Companies.Name
FROM   Companies
       INNER JOIN Customers
           ON Companies.CompanyId = Customers.CompanyId
       RIGHT OUTER JOIN Orders
           OM Customers.CustomerId Orders.CustomerId

Dieser Abfrage die Anzahl der inneren und äußeren Verknüpfungen, die ich erwarte, aber das problem ist, dass es schwer zu Lesen für mich, weil ich meine Abfrage als Abfrage von Bestellungen im Hinterkopf, wo ein Auftrag ist "root" der Auswahl-und nicht das Unternehmen. Auch die Verwendung von RIGHT OUTER JOIN ist eher ungewohnt für mich.

Die Letzte Abfrage ist ein kleiner Teil einer Abfrage generiert, die der designer für SQL Server Reporting Services-Berichte. Ich bin versucht, zu schreiben, die Abfrage manuell ohne designer-Oberfläche, da ist es sehr überfüllt und ich habe Probleme zu erhalten, die Abfrage nach vielen änderungen und weitere änderungen sind zu erwarten in der Zukunft. So möchte ich in der Abfrage eine lesbare Struktur irgendwie.

Fragen:

  1. Warum nicht Abfrage 1 Arbeit, wie ich erwartet?
  2. Ist die Abfrage 2 die richtige Lösung, obwohl (oder weil?) es verwendet zwei LINKS ANDEREN VERKNÜPFUNGEN?
  3. Ist die Abfrage 3 die richtige Lösung?
  4. Gibt es eine bessere Art und Weise zu schreiben, die Abfrage?
  5. Gibt es einige Allgemeine Faustregeln und Praktiken, wie Sie eine Abfrage schreiben, mit einer Menge von outer-und inner joins in einer gut lesbaren Art und Weise?
  • Im nicht sagen, Sie sind falsch, aber wie kann eine Bestellung nicht über einen Kunden. Ein Auftrag ist eine Kombination aus einem Produkt und ein Kunde sicher
  • Kein reales Vorbild. Man denke nur an die "anonymen" Aufträge, bei denen eine Produktion Firma hat interne Aufträge zur Fertigung auf Lager, ohne Kunden-Referenz ... oder so ähnlich.
  • Eine Lösung ist hier eine "anonyme" Kunden-Datensatz können Sie match-up für diese, eher als nicht-Kunde auf alle. Sie werden wahrscheinlich feststellen, dieser Ansatz hilft mit vielen anderen berichten auch.
InformationsquelleAutor Slauma | 2013-05-08
Schreibe einen Kommentar