Ошибка SQL: The multi-part identifier could not be bound
Я изучаю SQL и не до конца понимаю, что делаю в этом коде. Мне кажется, что я пытаюсь создать сущность DimaLaptop от класса Laptop. Поле класса DimaLaptop.screen при помощи оператора INNER JOIN, я пытаюсь определить как значение поля OlgaLaptop.screen . Однако, здесь SQL возвращает ошибку:
The multi-part identifier "DimaLaptop.screen" could not be bound.
Я использую такой SQL запрос. Он выглядит странно, потому что записан не до конца.
SELECT DISTINCT ProductCheck.maker, ProductCheck.model
FROM
Laptop as DimaLaptop,
Product as MishaDevice
-- Размер экрана Диминого Laptop на 3 больше Олиного
INNER JOIN Laptop as OlgaLaptop
ON OlgaLaptop.screen + 3 = DimaLaptop.screen
-- Дима и Миша пользуются продуктами от одного производителя
Разумеется, никаких классов, сущностей и полей здесь нет - это не больше чем несколько таблиц, в которых я жонглирую ссылками на столбцы. Может быть, я "определил" объект класса Laptop DimaLaptop неправильно? Не могли бы вы указать мне на мою ошибку?
Ответы (1 шт):
Везде говорят, что запятая (картезианское произведение таблиц) и CROSS JOIN - это одно и то же... а вот ни разу не так.
Да, по выполняемой функции похоже. Но различается приоритетом - запятая имеет приоритет меньше, чем все JOIN. И соответственно предложение
FROM
Laptop as DimaLaptop,
Product as MishaDevice
INNER JOIN Laptop as OlgaLaptop
с учётом приоритета эквивалентно
FROM Laptop as DimaLaptop
CROSS JOIN ( Product as MishaDevice
INNER JOIN Laptop as OlgaLaptop )
Само собой, когда выполняется INNER JOIN, таблица DimaLaptop, которая за скобками, ещё не принимает участия в формировании источника данных, не видна, и попытка использовать её поля приводит к тому, что The multi-part identifier "DimaLaptop.screen" could not be bound.
Процитирую комментарий:
Ни при каких обстоятельствах не стоит смешивать в одном запросе явное (
TABLE1 JOIN TABLE2 ON…) и неявное (TABLE1, TABLE2) соединение! – Герман Борисов
С учётом изложенного - замените запятую на CROSS JOIN, и проблема рассосётся сама собой.