2009-08-11 16 views
6

W tabelach zapytań SQL czasami muszę odwoływać się do wielu tabel w klauzuli ON. Na przykład:Błąd SQL: Nie można powiązać wieloczęściowego identyfikatora "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 

Jednak powyżej dałby ten błąd:

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

Wydaje się, że klauzula LEFT JOIN rachunku ON „widzi” tylko ostatni stolik wymienione w FROM lista. Czy to prawda? Jakiekolwiek obejścia?

+0

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

Odpowiedz

7

Nie możesz zmień składnię SQL-89 Składnia "tabela, tabela" przy użyciu składni połączenia SQL-92 "Tabela POŁĄCZENIE LEWEJ tabeli na warunek"

+1

wydaje się, że można je mieszać, ale kolejność jest ważna Spróbuj: wybierz * z \t msdb..sysjobsteps s, msdb..sysjobs j dołącz msdb..syscategories c na j.category_id = c.category_id gdzie j. job_id = s.job_id –

+1

ale mieszanie ich tak, jak chce JerSchneid, jest oczywiście inne! –

+0

Zgaduję, że zewnętrzne sprzężenia przedstawiają nierozwiązywalne problemy kompilatorowi podczas próby rozwiązania logiki. (specyfika zewnętrznych warunków łączenia jest jedną z rzeczy, które różnią się znacząco między tymi dwoma elementami). – RBarryYoung

0

Spróbuj

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

nie jestem shure dlaczego Si że lecz z PeopleTable p, JobTable j można zastąpić 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 

najlepsze Regrads, Iordan

+0

, który byłby spowodowany tym, że został napisany jako połączenie krzyżowe już w starej, przestarzałej składni. Nie jestem przekonany, co napisał, jest to, czego naprawdę potrzebuje. – HLGEM

3

Mimo że składnia łączenia krzyżowego jest bezpośrednim tłumaczeniem tego, co podałeś, może nie być odpowiednia dla twojej sytuacji. Połączyłoby wszystkich ludzi ze wszystkimi zadaniami przed odejściem do tabeli wynagrodzeń. Nie wydaje się prawdopodobne, że tego właśnie chcesz.

Czy naprawdę masz ludzi, którzy nie są związani z pensją? W tej sprawie chcesz zobaczyć wszystkie prace, które nie są powiązane z wynagrodzeniem lub ludźmi? Przykładowe dane i zestaw wyników pomogłyby nam uzyskać zapytanie, które spełnia to, czego naprawdę potrzebujesz. Podejrzewam, że jedną z poniższych czynności może dać lepsze rezultaty:

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

Właśnie zrobiłem te stoły jako przykład. Natrafiam na ten typ stołu, stołu, kwestii łączenia lewych raz na jakiś czas i zastanawiałam się, czy nie ma tam jakichś sztuczek, których nie znałam, nie zmieniając mojego zapytania. – JerSchneid

Powiązane problemy