Разрешение подвыбора SQL

У меня есть 2 таблицы, а именно клиент и продукт ниже, есть определение

покупатель

  • customer_id.
  • customer_name.

товар

  • product_id.
  • product_name.

таблица клиентов заполняется, как показано ниже

customer_id |customer_name
----------------------------
1          |  abc
----------------------------
2          |  efg
------------------------------

таблица продуктов заполняется, как показано ниже

product_id|product_name
------------------------------
1          |  chair
-----------------------------
2          |  desk
------------------------------

Когда я запускаю следующий запрос

SELECT customer_id FROM customer WHERE customer_id IN (SELECT customer_id FROM product)

я ожидал, что он будет жаловаться с ошибкой на отсутствие столбца customer_id в таблице продуктов, вместо этого этот запрос возвращает все строки таблицы клиентов. Кто-нибудь может объяснить, что здесь происходит? Почему sub select использует таблицу из родительского запроса и возвращает результаты без жалоб?


person AceKing    schedule 18.09.2017    source источник


Ответы (1)


Это связано с тем, что customer_id в подзапросе является неполным столбцом и не использует ссылку на псевдоним. Затем MySQL в этом случае ищет ссылки на таблицы для этого столбца, поэтому он разрешается как столбец customer_id из таблицы customer.

В этих случаях следует использовать псевдонимы, например:

SELECT c.customer_id 
FROM customer AS c 
WHERE c.customer_id IN (SELECT p.customer_id FROM product as p)

В этом случае вы получите ошибку, которую ищете: D

person Community    schedule 18.09.2017
comment
Означает ли это, что такой запрос, как DELETE FROM customer WHERE customer_id IN (SELECT customer_id FROM product ), удалит все записи из таблицы клиентов? это звучит страшно - person AceKing; 19.09.2017