Ошибка SQL: многослойный идентификатор “имя таблицы. ColumnName” не мог быть связан

Когда 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: многослойный идентификатор "p. PeopleID" не мог быть связан.

Кажется что ON пункт в a LEFT JOIN оператор может только "видеть" последнюю таблицу, перечисленную в FROM список. Действительно ли это верно? Какие-либо обходные решения?

7
задан xXx 21 August 2019 в 09:34
поделиться

4 ответа

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

7
ответ дан 7 December 2019 в 01:24
поделиться

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

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

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
3
ответ дан 7 December 2019 в 01:24
поделиться

Попробуйте

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
ответ дан 7 December 2019 в 01:24
поделиться

Я не уверен, почему это так, но FROM 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

Best Regrads, Иордан

0
ответ дан 7 December 2019 в 01:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: