2014-09-24 117 views
0

我不知道這是否可能有相同的結果下面的請求不使用子查詢選擇:與WHERE NOT IN條件無子查詢

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

你想這樣做,沒有一個子查詢(儘管NOT EXISTS可能比NOT IN更快)爲什麼 – 2014-09-24 09:15:50

+0

SELECT p2.id FROM產品P2 LEFT JOIN product_translations噸 ON t.heroshop_record_id = p2.id AND t.locale = 'FR' WHERE t.heroshop_record_id爲null – mhn 2014-09-24 09:16:54

+0

@a_horse_with_no_name完全相同,也可以是左連接到product_translations並通過使用IS 'product_translations'表上一列的NULL條件。 – 2014-09-24 09:17:55

回答

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' 
); 
+0

我沒那麼想,謝謝!你知道哪一個將是最有效的? – louiscoquio 2014-09-24 09:33:49

+0

一個偉大的dbms會認識到NOT IN,NOT EXISTS和LEFT JOIN技術實際上在這裏做同樣的事情,並且會在內部總是使用相同的執行計劃。 MySQL並不是那麼棒。它以快速連接和IN子句緩慢而着稱。但是,根據表格中記錄的數量,匹配的數量以及是否存在適當的索引,這裏可能會有所不同。你試一試。您也可以使用EXPLAIN來查看執行計劃。 – 2014-09-24 09:38:45

+0

完美的解釋,謝謝 – louiscoquio 2014-09-24 09:50:59