2009-08-11 11 views
6

Cuando LEFT JOINing tablas en una consulta SQL, a veces tengo que hacer referencia a varias tablas en la cláusula ON. Por ejemplo:Error de SQL: El identificador de varias partes "tableName.ColumnName" no se pudo vincular

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 

Sin embargo, lo anterior le daría a este error:

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

Parece que la cláusula ON en un comunicado LEFT JOIN sólo puede "ver" la última tabla que aparece en la FROM lista. ¿Es esto cierto? ¿Alguna solución?

+0

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

Respuesta

7

No se puede mezclar el SQL-89 sintaxis de unión "mesa" con la sintaxis SQL-92 Join "LEFT JOIN tabla tabla en la condición de"

+1

parece que se puede mezclar, pero el orden es importante tratar: select * de \t msdb..sysjobsteps s, j msdb..sysjobs unen msdb..syscategories c en j.category_id = c.category_id donde j. job_id = s.job_id –

+1

pero mezclarlos de la manera que JerSchneid quiere es obviamente diferente! –

+0

Supongo que las uniones externas presentan problemas irresolubles al compilador al intentar resolver la lógica. (la especificidad de las condiciones de combinación externa es una de las cosas que es significativamente diferente entre los dos). – RBarryYoung

0

Trate

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

no estoy Shure por eso si que sino de PeopleTable p, j JobTable se puede sustituir por combinación cruzada

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 

mejores Regrads, IORDAN

+0

que sería robaba que lo hizo escribir como una cruz ya obsoleta sintaxis de combinación enla edad. Sin embargo, no estoy convencido de que lo que escribió sea lo que realmente necesita. – HLGEM

3

Mientras que la combinación cruzada de sintaxis es una traducción directa de lo que ya ha proporcionado, puede que no sea adecuado para su situación. Asociaría a todas las personas con todos los trabajos antes de unirse a la tabla de salarios. Esto no parece probable que esto sea lo que quieres.

lo que realmente tienen alguna gente que no están asociados con un sueldo? Para ese asunto, ¿quieres ver trabajos que no estén asociados con un salario o personas? Los datos de muestra y el conjunto de resultados nos ayudarían a darle una consulta que hace lo que realmente necesita. Sospecho que una de las siguientes podrían dar mejores resultados:

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

De hecho acabo de hacer esas tablas como un ejemplo. Me encuentro con este tipo de tabla, tabla, problema de combinación izquierda de vez en cuando y me preguntaba si había algún truco que no supiera, aparte de reorganizar mi consulta. – JerSchneid

Cuestiones relacionadas