如何使用SQL
运算符将此join
查询从IN
转换为子查询。我在考试中被问到这个问题,但我无法理解这一点。
SELECT DISTINCT category_name
FROM categories c JOIN products p
ON c.category_id = p.category_id
ORDER BY category_name
解释它的工作方式会很棒。 感谢
答案 0 :(得分:2)
使用IN
,查询变为:
SELECT DISTINCT category_name
FROM categories c
WHERE c.category_id IN
(
SELECT products.category_id
FROM products
)
ORDER BY category_name
IN
运算符基本上是多个OR
条件的简写。
因此,在这种情况下,对于categories
的每条记录,子查询会选择产品category_id
并检查categories.category_id
是否等于products.category_id
中的任何一个。如果是,那么该记录将包含在结果集中,如果没有,那么它将被排除在结果集之外。
答案 1 :(得分:0)
进行转换时,您可能不需要distinct
。据推测,在具有类别的表中,名称已经是唯一的:
SELECT c.category_name
FROM categories c
WHERE c.category_id IN (SELECT p.category_id FROM products p)
ORDER BY c.category_name