2017-01-28 11 views
0

Ich habe eine Abfrage mit einem JOIN auf ein paar Felder (ID_1 & ID_2).MS Access: JOIN mit verkettetem Feld

  • ID_1 nie
  • ID_2 Null sein Null sein kann oder nicht Null.
  • ID_1 & ID_2 in Kombination ist

Mein Problem Einzigartig: Der JOIN ist nicht das gewünschte Ergebnis zu erzeugen, wenn ID_2

Null ist, kann ich auf die Verkettung von ID_1 & ID_2 zum Zeitpunkt der Abfrage JOIN? Ein paar schwache Versuche haben nicht geholfen.

Ich würde es vorziehen, keinen neuen Index in den 2 Tabellen zu erstellen, da einer von ihnen nicht zu mir gehört.

Vielen Dank für jeden Hinweis.

vereinfachte Version meiner Anfrage:

SELECT Table1.ID_1, Table1.ID_2, Table1.Name, Table2.ID_1, Table2.ID_2, Table2.Owner 
FROM Table1 
LEFT JOIN Table2 ON (Table1.ID_2 = Table2.ID_2) AND (Table1.ID_1 = Table2.ID_1); 

über die Abfrage verwenden, ich sehe ID_1, ID_2 & Namen von Tabelle 1, aber nichts von Table2 wenn ID_2

Probe null ist ("Alternative") Daten: :)

Tabelle 1:

ID_1 ID_2 Name 
=========================== 
A001   ACME Corp 
A001 B001 ACME Medical 
A001 B002 ACME Pharmacy 
A002   General Electric Corp 
A003   Philips 

Tabelle 2:

ID_1 ID_2 Owner 
=========================== 
A001   Bob 
A001 B001 Lori 
A001 B002 Becky 
A002   Ravi 
A003   Joe 

Als ich LEFT JOIN, ich erwarte, dass die Informationen über die zwei Tabellen heiraten. Die Frage, wie beschreiben präsentiert das folgende Ergebnis - NUR in Owner Verbindung, wenn beide ID_1 und ID_2 sind beide nicht-Null (Besitzer = Null nicht das richtige Ergebnis ist):

Beigetreten (falsches Ergebnis):

ID_1 ID_2 Name    Owner 
========================================= 
A001   ACME Corp 
A001 B001 ACME Medical  Lori 
A001 B002 ACME Pharmacy  Becky 
A002   General Electric 
A003   Philips 
+1

Verwenden Sie einen 'LINKS JOIN'. Und zeige eine Anfrage, damit wir helfen können. – Parfait

+0

Beispielabfrage eingefügt über –

+0

Was passiert, wenn Sie die 'ID_2' ON-Klausel von' LEFT JOIN' entfernen und nur 'ID_1' lassen? – Parfait

Antwort

0

Lets go über JOINS:

INNER JOIN - zeigt nur COMMON ROWS zwischen den beiden Tabellen. Wenn die verbundene Tabelle NULL in dem COMMON FIELD IHREN VERBINDEN ON hat, wird die Zeile nicht angezeigt.

LINKE VERBINDUNG - Alle Zeilen aus der linken Tabelle enthalten. Nicht übereinstimmende Einträge aus der rechten Tabelle haben NULL

RECHTE VERBINDUNG - Alle Zeilen aus der rechten Tabelle enthalten. Nicht übereinstimmende Einträge aus der linken Tabelle haben NULL

FULL JOIN - Alle Zeilen von der linken und rechten Tabelle enthalten. Nicht übereinstimmende Einträge aus der linken und rechten Tabelle haben NULL.

Verwenden Sie eine LINKE VERBINDUNG wird Ihr gewünschtes Ergebnis geben.

Select A.ID_1 
     ,B.ID_2 
From tableA A 
LEFT JOIN tableB B 
ON A.ID_1 = B.ID_2 
+0

Entschuldigung, hätte geklärt werden müssen. Ich verwende in diesem Fall einen RECHTEN JOIN, aber die NULL ID_2 in Tabelle_1 & Tabelle_2 verhält sich nicht wie ein übereinstimmender Eintrag. –

+0

Beispielfrage eingefügt über –

0

Wenn Sie mit der mangelhaften Tabellenentwurf leben müssen, können Sie eine Abfrage wie folgt versuchen könnte:

SELECT Table1.ID_1, Table1.ID_2, Table2.OtherInfo 
FROM Table1 INNER JOIN Table2 ON ((Table1.ID_2 = Table2.ID_2) AND (Table1.ID_1 = Table2.ID_1)) 
OR ((Table1.ID_1 = Table2.ID_1) AND Table1.ID_2 IS NULL AND Table2.ID_2 IS NULL) 
+0

Thx! Ich werde diesen Ansatz versuchen. Ich war mir nicht sicher über die Syntax. –

+0

Beispiel oben optimiert, um zu meinem Beispiel zu passen, löst einen Syntaxfehler bei der JOIN-Operation aus. –

+0

Der Fehler, den Sie erhalten, besagt nur, dass er die Verknüpfung in der Entwurfsansicht nicht darstellen kann. Es sollte immer noch gut funktionieren. – tlemaster

0

Betrachten Sie die folgenden Variationen. Wählen Sie den am einfachsten zu wartenden oder effizientesten Typ aus.

Union Abfrage

Erste SELECT Capture-Datensätze mit passender IDs (ID_1 = ID_2) und zweiten SELECT Datensätze erfaßt, wo nur ID_1 Spiel aber ID_2 IS NULL in beiden Tabellen.

SELECT t1.ID_1, t1.ID_2, t1.[Name], t2.Owner 
FROM [Table1] t1 
INNER JOIN [Table2] t2 ON t1.ID_1 = t2.ID_1 AND t1.ID_2 = t2.ID_2 

UNION ALL 

SELECT t1.ID_1, t1.ID_2, t1.[Name], t2.Owner 
FROM [Table1] t1 
INNER JOIN [Table2] t2 ON t1.ID_1 = t2.ID_1 
WHERE t1.ID_2 IS NULL AND t2.ID_2 IS NULL; 

Alternativ betrachten einzelne SELECT Aussagen:

Explizite Join(mit OR in ON Klausel)

SELECT t1.ID_1, t1.ID_2, t1.[Name], t2.Owner 
FROM [Table1] t1 
INNER JOIN [Table2] t2 ON (t1.ID_1 = t2.ID_1 AND t1.ID_2 = t2.ID_2) 
     OR (t1.ID_1 = t2.ID_1 AND t1.ID_2 IS NULL AND t2.ID_2 IS NULL); 

Implicit Join(Abfrage ohne explizite JOIN)

SELECT t1.ID_1, t1.ID_2, t1.[Name], t2.Owner 
FROM [Table1] t1, [Table2] t2 
WHERE (t1.ID_1 = t2.ID_1 AND t1.ID_2 = t2.ID_2) 
    OR (t1.ID_1 = t2.ID_1 AND t1.ID_2 IS NULL AND t2.ID_2 IS NULL); 

Jede oben zurückkehren sollte (aber nicht unbedingt in derselben Reihenfolge) die folgende Ausgabe:

-- ID_1  ID_2 Name     Owner 
-- A001    ACME Corp    Bob 
-- A001  B001 ACME Medical   Lori 
-- A001  B002 ACME Pharmacy   Becky 
-- A002    General Electric Corp Ravi 
-- A003    Philips     Joe 
+0

Parfait, das sieht gut aus. Ich reise diese Woche, werde aber bei meiner Rückkehr in meiner aktuellen DB bestätigen. Ich werde mein Ergebnis zurücksenden. - Vielen Dank! –