SELECT with WHERE NOT IN 没有子查询的条件

lou*_*uio 1 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'
);
Run Code Online (Sandbox Code Playgroud)

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

预期结果只能是没有product_translationslocale 的产品fr

Tho*_*ner 5

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

SELECT id
FROM products
WHERE id NOT IN 
(
  SELECT product_id 
  FROM product_translations
  WHERE locale = 'fr'
);
Run Code Online (Sandbox Code Playgroud)

如果没有子查询,您将不得不外部连接翻译表并消除匹配项:

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;
Run Code Online (Sandbox Code Playgroud)

编辑:为了完整起见,这里是 NOT EXISTS 版本(当然也需要一个子查询):

SELECT id
FROM products
WHERE NOT EXISTS
(
  SELECT *
  FROM product_translations
  WHERE product_id  = products.id
  AND locale = 'fr'
);
Run Code Online (Sandbox Code Playgroud)