我想知道是否可以在不使用子查询的情况下获得与以下请求相同的结果:
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
的产品。
答案 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'
);