8 Stimmen

LEFT JOINing nach zusätzlichen Kriterien in MS Access

Ich habe die folgende T-SQL-Abfrage (ein einfacher Testfall), die in MS SQL gut läuft, kann aber die entsprechende Abfrage in MS Access (JET-SQL) nicht erhalten. Das Problem sind die zusätzlichen Kriterien im LEFT JOIN. Wie kann ich dies in MS Access tun?

T-SQL:

SELECT * FROM A 
LEFT OUTER JOIN B ON A.ID = B.A_ID 
                 AND B.F_ID = 3

JET-SQL (was ich bisher habe, aber Access abstürzen lässt!):

SELECT * FROM dbo_A 
LEFT JOIN dbo_B ON (dbo_A.ID = dbo_B.A_ID AND dbo_B.F_ID = 3)

0 Stimmen

Die Klammern bei den Verknüpfungskriterien sollten nicht erforderlich sein.

0 Stimmen

Spielt es eine Rolle, dass das T-SQL-Beispiel eine äußere Verknüpfung ist? Alles, was es im Wesentlichen tut, ist die Rückgabe aller Zeilen in A.

0 Stimmen

@OMG Ponies - Ohne die Klammern bekomme ich einen Syntaxfehler, mit ihnen stürzt Access ab... @Melvin - Nein, das Wort OUTER ist optional.

13voto

David-W-Fenton Punkte 22473

Sie müssen eine Unterauswahl verwenden, um die Bedingung anzuwenden:

  SELECT *
  FROM dbo_A LEFT JOIN 
    [SELECT dbo_B.* FROM dbo_B WHERE dbo_B.F_ID = 3]. AS dbo_B 
      ON dbo_A.ID = dbo_B.A_ID;

Wenn Sie Access mit aktiviertem "SQL 92"-Kompatibilitätsmodus ausführen, können Sie den Standardmodus verwenden:

  SELECT *
  FROM dbo_A LEFT JOIN 
    (SELECT dbo_B.* FROM dbo_B WHERE dbo_B.F_ID = 3) AS dbo_B 
      ON dbo_A.ID = dbo_B.A_ID;

Müssen Sie dies in Access bearbeiten können? Wenn nicht, verwenden Sie einfach eine Passthrough-Abfrage mit dem nativen T-SQL. Wenn ja, würde ich wahrscheinlich eine serverseitige Ansicht für diese erstellen, und ich würde vor allem wollen, um es serverseitig zu verschieben, wenn die literalen Wert ist etwas, das Sie parametrisieren würde (dh die F_ID = 3 ist wirklich F_ID = N, wo N ein Wert zur Laufzeit gewählt).

Übrigens schreibe ich diese SQL-Anweisungen für abgeleitete Subselect-Tabellen jeden Tag, wenn ich mit Access arbeite. Das ist keine große Sache.

1voto

Tom H Punkte 45699

Erhalten Sie eine Fehlermeldung, wenn das Programm abstürzt, oder bleibt es einfach stehen? Nach dem Namen dbo_B zu urteilen, gehe ich davon aus, dass es sich um verknüpfte Tabellen in Access handelt. Ich glaube, dass Access bei einer solchen Verknüpfung dem SQL-Server nicht mitteilt, dass es das Ergebnis der Verknüpfung benötigt, sondern sagt: "Gib mir alle Zeilen beider Tabellen", und dann versucht, sie selbst zu verknüpfen. Wenn die Tabellen sehr groß sind, kann dies dazu führen, dass die Anwendung blockiert wird.

Sie sind wahrscheinlich besser dran, wenn Sie eine Ansicht auf SQL Server für das, was Sie brauchen, erstellen.

0voto

Ich denke, dass MS Access den Namen beider Tabellen in jedem Abschnitt der Joins ON Klausel erwartet. Als ein Trick diese Arbeit für mich:

SELECT * FROM A 
LEFT OUTER JOIN B ON A.ID = B.A_ID 
                 AND B.F_ID = IIF(True, 3, A.ID) 

A.ID oder ein anderes Feld aus Tabelle A

-4voto

Melvin Punkte 258

Bei der letzten Bedingung handelt es sich technisch gesehen nicht um eine Verknüpfung, sondern um einen Vergleich mit einem literalen Wert. Fügen Sie sie in eine WHERE-Klausel ein:

SELECT *
FROM a LEFT OUTER JOIN b ON a.ID = b.a_id
WHERE b.f_id = 3;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X