Изучите эту проблему SQL. Очень интересно, почему SQL компилируется. Последний оператор выбора должен выдать ошибку и ошибку, поскольку столбец client_id не существует во временной таблице. Похоже, используется область видимости первой таблицы client_orders. Но даже в этом случае после разрешения он всегда принимает значение ИСТИНА при оценке оператора IN. Ниже приведен код.
Это просто загадка. У меня есть проводник, что происходит, когда оператор в IN является нулевым или недействительным, и он просто воспринимается как ошибка компиляции. Кажется, что есть путаница с использованием client_id.
Вот пример.
IF OBJECT_ID('client_order') IS NOT NULL DROP TABLE client_order
IF OBJECT_ID('tempdb.dbo.#to_delete') IS NOT NULL DROP TABLE #to_delete
GO
CREATE TABLE client_order
(
client_id INT NOT NULL,
order_id INT NOT NULL,
order_data CHAR(100) NOT NULL DEFAULT '{"amount":12}'
)
GO
INSERT INTO client_order (client_id, order_id) VALUES
(1, 1),
(1, 2),
(2, 1),
(2, 2),
(2, 3),
(3, 1)
SELECT * FROM client_order
CREATE TABLE #to_delete
(
bobo INT NOT NULL
)
INSERT INTO #to_delete VALUES (1),(3)
SELECT * FROM client_order
WHERE client_id IN (SELECT client_id FROM #to_delete)
- WTF? Почему все записи были возвращены?!
- Я знаю, что выборка в #to_delete использует неправильный столбец, но почему это не было воспринято как ошибка
- Более того, почему этот оператор выбора всегда возвращает истину при проверке, является ли client_id IN этим оператором?
Значения client_id, равные 2, должны оставаться. Почему не они?