2009-08-11 15 views
6

Quando le tabelle LEFT JOINing in una query SQL, a volte ho bisogno di fare riferimento a più tabelle nella clausola ON. Per esempio:Errore SQL: impossibile associare l'identificatore di più parti "tableName.ColumnName"

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 

Tuttavia, quanto sopra darebbe questo errore:

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

Sembra che la clausola ON in un comunicato LEFT JOIN può solo "vedere" l'ultima tabella elencata nella FROM elenco. È vero? Qualche soluzione alternativa?

+0

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

risposta

7

Non è possibile mescolare SQL-89 Sintassi di join "table, table" con SQL-92 Sintassi di join "tabella LEFT JOIN table ON condition"

+1

sembra potete mescolarli, ma l'ordine è importante prova: selezionare * da \t msdb..sysjobsteps s, msdb..sysjobs j unirsi msdb..syscategories c on j.category_id = c.category_id dove j. job_id = s.job_id –

+1

ma mescolandoli nel modo in cui JerSchneid vuole è ovviamente diverso! –

+0

Suppongo che i join esterni presentino problemi irreversibili al compilatore quando si cerca di risolvere la logica. (la specificità delle condizioni di join esterne è una delle cose che è significativamente diversa tra le due). – RBarryYoung

0

Prova

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

non sto shure perché si che Ma da PeopleTable p, j jobtable può essere sostituito con 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 

migliori Regrads, Iordan

+0

che sarebbe stato perché l'aveva scritto come cross join già nella vecchia sintassi obsoleta. Non sono convinto che quello che ha scritto sia ciò di cui ha davvero bisogno. – HLGEM

3

Mentre la sintassi del cross join è una traduzione diretta di ciò che hai fornito, potrebbe non essere adatta alla tua situazione. Avrebbe associato tutte le persone a tutti i lavori prima di unirsi a sinistra allo della tabella degli stipendi. Questo non sembra probabile che questo è quello che vuoi.

Avete davvero persone che non sono associate a un salario? Per quello che vuoi vedere i lavori che non sono associati a uno stipendio o persone? I dati di esempio e il set di risultati ci aiuteranno a darti una query che fa ciò di cui hai veramente bisogno. Ho il sospetto che una delle seguenti potrebbe dare risultati migliori:

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

In realtà ho appena creato quei tavoli come esempio. Mi imbatto in questo tipo di tavolo, tavolo, problema di join sinistro ogni tanto e mi chiedevo solo se ci fossero dei trucchetti che non conoscevo, oltre a riorganizzare la mia richiesta. – JerSchneid

Problemi correlati