Описание столбцов в вашем tblB
не соответствует образцу данных, который показывает первый столбец как tblb_ID
.Если это правильное имя, то
SELECT id
FROM tblA as a
WHERE NOT EXISTS
(
SELECT * FROM tblB AS b
WHERE a.id = b.id
)
недопустимо и должно быть помечено как синтаксическая ошибка, потому что b.id
нет.Если это не так, у вас есть сообщение об ошибке.
Тем не менее, я бы изменил рекомендуемое исправление на
SELECT id
FROM tblA as a
WHERE NOT EXISTS
(
SELECT 1 FROM tblB AS b
WHERE a.id = b.tblb_ID
)
, потому что это упрощает работу для обработчика запросов и улучшаетпередает ваше намерение.
Значение SELECT
и, следовательно, SELECT *
часто понимают неправильно.SELECT
- это SQL-реализация PROJECT в реляционной алгебре: она указывает, какие столбцы (не строки) возвращать.SELECT *
возвращает все столбцы;если бы SQL не был пережитком эпохи языков 4-го поколения, мы могли бы обойтись без SELECT *
, потому что project all совпадает с no projection .
В тесте на существование проекция отсутствует, т. Е. столбцы не выбраны .Вся критическая информация находится в FROM
и WHERE
.Строка - вся строка - либо соответствует критерию WHERE
, либо нет.Значение строки нигде не возвращается.Например, он не доступен для внешнего запроса.«Выбрать» бессмысленно;он существует только потому, что этого требует синтаксис.
Говоря SELECT 1
, мы подчеркиваем, что это логический тест и что ничего не "выбирается" как таковое .