Ошибка SQL: не удалось связать многоэлементный идентификатор «tableName.ColumnName» - PullRequest
7 голосов
/ 11 августа 2009

Когда LEFT JOINing таблицы в запросе SQL, иногда мне нужно сослаться на несколько таблиц в предложении ON. Например:

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

Тем не менее, выше сказанное даст эту ошибку:

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

Кажется, что предложение ON в операторе LEFT JOIN может "видеть" только последнюю таблицу, указанную в списке FROM. Это правда? Есть обходные пути?

Ответы [ 4 ]

7 голосов
/ 11 августа 2009

Нельзя смешивать синтаксис соединения SQL-89 "таблица, таблица" с синтаксисом соединения SQL-92 "условие таблицы LEFT JOIN ON таблицы"

3 голосов
/ 11 августа 2009

Хотя синтаксис перекрестного соединения является прямым переводом того, что вы предоставили, он может не подходить для вашей ситуации. Это связало бы всех людей со всеми работами до того, как они ушли в таблица зарплат. Похоже, это не то, что вы хотите.

У вас действительно есть люди, которые не связаны с зарплатой? В связи с этим вы хотите увидеть какие-либо работы, которые не связаны с зарплатой или людьми? Образцы данных и набор результатов помогут нам дать вам запрос, который будет делать то, что вам действительно нужно. Я подозреваю, что одно из следующего может дать вам лучшие результаты:

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 голосов
/ 11 августа 2009

Я не уверен, почему это так, но из PeopleTable p, JobTable j можно заменить 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

Лучшие реграды, Йордан

0 голосов
/ 11 августа 2009

Попробуйте

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...