2009-07-27 8 views
1

Was fehlt mir? Ich muss alle Datensätze zurückgeben, die der Last_Name-Abfrage entsprechen, ob sie in der Field_Table eine Kundennummer haben oder nicht.SQL Vier Tabellen Ein Recordset

Ich rufe die Client-Tabelle zweimal auf, weil jede Client-ID einen Elternteil hat, dessen Kontaktnummer = 0 ist. Ich brauche den übergeordneten Datensatz, um die Stadt, den Staat, die Postleitzahl und den Firmennamen zurückzugeben.

Ich habe versucht, mit recordset.movenext looping, aber die Abfrage wird extrem langsam, die Schleifenbildung unerwünscht macht.

Wie kann ich die Client-Tabelle abfragen, um die Kundennummer einzufügen, wenn sie verfügbar ist, und zurückgeben, wenn sie fehlt?

Aktuelle Ergebnisse sind Datensätze, die mit der Last_Name-Abfrage übereinstimmen und eine Kundennummer haben. Ich erhalte keine Datensätze, die der Abfrage last_name entsprechen, aber KEINE Kundennummer haben.

Hinweis: Wenn das Unternehmen keine Nummer hat, hat das Unternehmen keinen Eintrag in der Field_Table.

SELECT A.Contact, 
     A.Id, 
     A.First_Name, 
     A.Last_Name, 
     B.Company_Name, 
     B.City, 
     B.State, 
     FT.Number 
FROM Client C 
    INNER JOIN Client B ON A.Id = B.Id 
    LEFT OUTER JOIN Field_Table FT ON B.Id = FT.Id 
    LEFT OUTER JOIN Field_Definitions FD ON FT.Type_Id = FD.Type_Id 
WHERE (A.Last_Name LIKE '%Last Name%') 
    AND (B.Contact = 0) 
    AND (FD.Description = 'Customer Number') 

Antwort

1

Sie müssen den FD.Description Teil in der ON-Join-Bedingung setzen, nicht in der Klausel WHERE.

SELECT A.Contact, A.Id, A.First_Name, A.Last_Name, B.Company_Name, B.City, B.State, FT.Number 
FROM Client C 
INNER JOIN Client B ON A.Id = B.Id 
LEFT OUTER JOIN Field_Table FT ON B.Id = FT.Id 
LEFT OUTER JOIN Field_Definitions FD ON (FT.Type_Id = FD.Type_Id) AND (FD.Description = 'Customer Number') 
WHERE (A.Last_Name LIKE '%Last Name%') AND (B.Contact = 0) 
+0

Vielen Dank für Ihre schnelle Antwort. Während Quassnoi an der Ausarbeitung Ihres Vorschlags mitarbeitete, der übrigens eine ganze Menge Einblick in mich bietet, gab er mir die Antwort, nach der ich suchte. Nochmals vielen Dank für Ihre Unterstützung. – Jason

0
SELECT A.Contact, 
     A.Id, 
     A.First_Name, 
     A.Last_Name, 
     B.Company_Name, 
     B.City, 
     B.State, 
     FT.Number 
FROM Client C 
INNER JOIN 
     Client B 
ON  B.Id = A.id 
     AND B.contact = 0 
INNER JOIN 
     Field_Definitions FD 
ON  FD.Description = 'Customer Number' 
LEFT OUTER JOIN 
     Field_Table FT 
ON  FT.Type_Id = FD.Type_Id 
     AND FT.id = B.Id 
WHERE A.Last_Name LIKE '%Last Name%' 
+0

Ich weinte gerade jetzt. Quassnoi, deine Lösung hat perfekt funktioniert. Vielen Dank! – Jason

0

Jetzt verstehen Sie, warum Sie nicht den Verweis auf die Tabelle in der rechten Seite des LEFT JOIN in der Klausel, wo setzen können? Der Grund dafür ist, dass Sie die Join-Anweisung in eine interne Join-Anweisung konvertieren, da die where-Bedingung von allen Datensätzen erfüllt werden muss. Immer wenn Sie einen linken Join verwenden, ist der einzige Verweis darauf, der den Join bearbeitet und behält, derjenige, in dem Sie nach NULL-Datensätzen suchen, die Ihnen dann die Datensätze in den übrigen Joins, die nicht in der Tabelle enthalten sind, geben.

Verwandte Themen