2010-06-06 47 views
1

我有表A,B,C,其中A表示可以有零個或多個子項目存儲在C中的項目。B表只有2個外鍵連接A和C.是否有替代方法來編寫此查詢?

我有這個SQL查詢:

select * from A 
where not exists (select * from B natural join C where B.id = A.id and C.value > 10); 

它說:「給我從表格中的每一個項目,所有子項具有值小於10

有沒有辦法來優化這一點,有沒有寫這個辦法?不使用exists運營商?

回答

1

有三種常用的方法來測試,如果發現某個值在一個表中,但不是另一個:

  • NOT EXISTS
  • NOT IN
  • LEFT JOIN ... WHERE ... IS NULL

您已經顯示第一個代碼。這裏是第二:

SELECT * 
FROM A 
WHERE id NOT IN (
    SELECT b.id 
    FROM B 
    NATURAL JOIN C 
    WHERE C.value > 10 
) 

並與左連接:

SELECT * 
FROM A 
LEFT JOIN (
    SELECT b.id 
    FROM B 
    NATURAL JOIN C 
    WHERE C.value > 10 
) BC 
ON A.id = BC.id 
WHERE BC.id IS NULL 

根據數據庫類型和版本,可能會導致不同的查詢計劃具有不同性能特點的三種不同的方法。

相關問題