【发布时间】:2014-04-03 05:04:36
【问题描述】:
SELECT st.state_id,
st.state_name,
st.country_id
FROM state_table st
WHERE EXISTS (SELECT 0 / 0
FROM country c
WHERE st.country_id = c.country_id
AND c.country_name = 'India')
此查询产生与st.country_id = c.country_id 匹配的预期输出。然而,在此查询中,内部子查询中的0 / 0 预计将替换为c.country_id。
等效的 IN() 查询如下所示。
SELECT st.state_id,
st.state_name,
st.country_id
FROM state_table st
WHERE country_id IN(SELECT c.country_id
FROM country c
WHERE c.country_name = 'India')
似乎EXISTS() 子查询内的select 子句中的列列表被忽略了。这是真的吗?
【问题讨论】:
-
是的。重要的是子选择是否找到任何行。
-
我建议使用
JOIN而不是EXISTS或IN。 -
@user2864740 - 使用 SELECT 1,这使得选择更简单,只需要构建一行/列即可建立 TRUE,甚至更好的用户 JOIN,正如 Barmar 建议的那样 - 它的速度更快。
-
@Barmar:MySQL 的最新版本正确处理
IN样式的半连接。无论如何,在这种情况下,子查询在大多数情况下可能只返回一行。 -
@PreetSangha 哦,好的。这将是我对 EXISTS 的新方式。