选择WHERE NOT IN条件没有子查询

时间:2014-09-24 09:13:26

标签: mysql sql postgresql

我想知道是否可以在不使用子查询的情况下获得与以下请求相同的结果:

SELECT p1.id
FROM products p1
WHERE NOT p1.id IN (
  SELECT p2.id
  FROM products p2
  JOIN product_translations t
    ON t.product_id = p2.id
   AND t.locale = 'fr'
);

如您所见,products行可以有多个product_translations行(0..n)。

预期结果必须只是没有product_translations区域设置fr的产品。

1 个答案:

答案 0 :(得分:3)

不需要子查询内的连接。您的查询因此等于:

SELECT id
FROM products
WHERE id NOT IN 
(
  SELECT product_id 
  FROM product_translations
  WHERE locale = 'fr'
);

如果没有子查询,您必须外部加入转换表并消除匹配:

SELECT p.id
FROM products p
LEFT JOIN product_translations pt ON pt.product_id = p.id AND pt.locale = 'fr'
WHERE pt.product_id IS NULL;

编辑:只是为了完整性'这里是NOT EXISTS版本(当然也需要子查询):

SELECT id
FROM products
WHERE NOT EXISTS
(
  SELECT *
  FROM product_translations
  WHERE product_id  = products.id
  AND locale = 'fr'
);