使用带有IN运算符的where子句而不是join

时间:2017-11-05 00:19:03

标签: sql oracle

如何使用SQL运算符将此join查询从IN转换为子查询。我在考试中被问到这个问题,但我无法理解这一点。

SELECT DISTINCT category_name
FROM categories c JOIN products p
ON c.category_id = p.category_id
ORDER BY category_name

解释它的工作方式会很棒。 感谢

2 个答案:

答案 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