2009-08-11 11 views
6

Wenn LEFT JOINing Tabellen in einer SQL-Abfrage, muss ich manchmal auf mehrere Tabellen in der ON Klausel verweisen. Zum Beispiel:SQL-Fehler: Die mehrteilige ID "tableName.ColumnName" konnte nicht gebunden werden

SELECT p.Name, j.Job, s.Salary 
FROM PeopleTable p, JobTable j 
LEFT JOIN SalaryTable s ON s.PeopleID=p.PeopleID AND s.JobID=j.JobID 

Jedoch würde der oben diesen Fehler geben:

SQL Error: The multi-part identifier "p.PeopleID" could not be bound.

Es scheint, dass die ON-Klausel in einer LEFT JOIN Anweisung kann nur die letzte Tabelle in den FROM aufgeführt „sehen“ Liste. Ist das wahr? Irgendwelche Problemumgehungen?

+0

See: http://stackoverflow.com/questions/1080097/the-multi-part-identifier-could-not-be-bound-on- sql-server-2005-8/1080407 # 1080407 –

Antwort

7

nicht ersetzt werden kann Mischen Sie die SQL-89 Join-Syntax "Tabelle, Tabelle" mit der SQL-92 Join-Syntax "Tabelle LINKE JOIN-Tabelle ON-Bedingung"

+1

es scheint, Sie können sie mischen, aber die Reihenfolge ist wichtig, versuchen: select * von \t msdb..sysjobsteps s, msdb..sysjobs j msdb..syscategories c auf j.category_id = c.category_id wo j verbinden. job_id = s.job_id –

+1

aber sie so zu mischen, wie es JerSchneid will, ist offensichtlich anders! –

+0

Ich vermute, dass die äußeren Joins dem Compiler unlösbare Probleme beim Versuch aufbringen, die Logik aufzulösen. (Die Spezifität der Outer-Join-Bedingungen ist eines der Dinge, die sich zwischen den beiden signifikant unterscheiden). – RBarryYoung

0

Versuchen
SELECT p.Name, j.Job, s.Salary 
FROM SalaryTable s 
LEFT JOIN PeopleTable p on s.PeopleID = p.PeopleID 
LEFT JOIN JobTable j ON s.JobID = j.JobID 
0

i shure bin nicht warum si, dass aber aus PeopleTable p kann JobTable j mit CROSS JOIN

SELECT p.Name, j.Job, s.Salary 
FROM PeopleTable p 
    CROSS JOIN JobTable j 
    LEFT JOIN SalaryTable s ON s.PeopleID=p.PeopleID AND s.JobID=j.JobID 

Beste Regrads, Sie Iordan

+0

das wäre, weil er es geschrieben hatte, als ein Kreuz schon in der alten veralteten Syntax beitreten. Ich bin nicht überzeugt, was er geschrieben hat, ist was er wirklich braucht. – HLGEM

3

Während die Cross-Join-Syntax eine direkte Übersetzung dessen ist, was Sie zur Verfügung gestellt haben, ist dies für Ihre Situation möglicherweise nicht richtig. Es würde alle Leute mit allen Jobs in Verbindung bringen, bevor sie sich der Gehaltsliste anschlossen. Dies scheint nicht wahrscheinlich, dass dies das ist, was Sie wollen.

Haben Sie wirklich irgendwelche Leute, die nicht mit einem Gehalt verbunden sind? Möchtest du irgendwelche Jobs sehen, die nicht mit einem Gehalt oder Leuten verbunden sind? Beispieldaten und Ergebnismenge würden uns helfen, Ihnen eine Abfrage zu geben, die das tut, was Sie wirklich brauchen. Ich vermute, eine der folgenden Aktionen könnten Sie bessere Ergebnisse liefern:

SELECT p.Name, j.Job, s.Salary 
FROM PeopleTable p 
JOIN SalaryTable s ON s.PeopleID=p.PeopleID 
RIGHT JOIN JobTable j ON s.JobID=j.JobID 

SELECT p.Name, j.Job, s.Salary 
FROM PeopleTable p 
JOIN SalaryTable s ON s.PeopleID=p.PeopleID 
JOIN JobTable j ON s.JobID=j.JobID 

SELECT p.Name, j.Job, s.Salary 
FROM SalaryTable s 
RIGHT JOIN PeopleTable p ON s.PeopleID=p.PeopleID 
RIGHT JOIN JobTable j ON s.JobID=j.JobID 
+0

Ich habe diese Tabellen eigentlich nur als Beispiel gemacht. Ich stoße auf diese Art von Tabelle, Tabelle, linkes Join-Problem hin und wieder und ich habe mich nur gefragt, ob da irgendwelche Tricks da draußen waren, die ich nicht kannte, außer meiner Frage neu zu ordnen. – JerSchneid

Verwandte Themen