2011-05-10 48 views
1

我有Visual Studio 2005,並且正在VB中編寫代碼,而不是C +。我需要一個Select語句,並找到一些接近但不符合我的情況。我有三個表:加入兩個表格,然後從第三個表中拉出不匹配的記錄

PROJECT 
    [Projnum] 
    [ShipDate] 

CUSTOMER 
    [Projnum] 
    [Jobnum] 

TAGS 
    [Jobnum] 

我需要加入客戶和項目,所以我知道所有的CUSTOMER.Jobnum記錄,其中PROJECT.ShipDate爲空。在這些記錄中,我需要從TAGS.Jobnum中找出哪些沒有匹配的記錄。

任何幫助將不勝感激。謝謝你,Chuck。

回答

0
SELECT c.Jobnum 
    FROM customer c 
     INNER JOIN project p 
      ON c.Projnum = p.Projnum 
    WHERE p.ShipDate IS NULL 
     AND NOT EXISTS(SELECT NULL FROM tags t WHERE t.Jobnum = c.Jobnum) 
0

如果我理解正確:

PROJECT 
    ProjNum 
    ShipDate 

CUSTOMER 
    ProjNum 
    JobNum 

TAGS 
    JobNum 

而且你希望所有未發貨項目:

SELECT c.JobNUm 
FROM Project p 
    INNER JOIN Customer c 
    ON c.ProjNum = p.ProjNum 
WHERE p.ShipDate is null 

然後你想而不在標籤表JobNum的那些:

SELECT c.JobNUm 
FROM Project p 
    INNER JOIN Customer c 
    ON c.ProjNum = p.ProjNum 
WHERE p.ShipDate is null 
    AND c.JobNum NOT IN (SELECT JobNum from TAGS) 

可以做得更簡單,但我想展示我的作品。

0

A LEFT JOIN可能會快於NOT INNOT EXISTS

SELECT c.JobNUm 
FROM Project p 
    INNER JOIN Customer c 
    ON c.ProjNum = p.ProjNum 
    LEFT JOIN tags t ON t.jobnum=c.jobnum 
WHERE p.ShipDate is null AND t.jobnum IS NULL 
+0

'NOT EXISTS'應該更快。請參閱:[左外連接vs不存在](http://sqlinthewild.co.za/index.php/2010/03/23/left-outer-join-vs-not-exists/) – 2011-05-10 20:35:21

+0

對於幾個版本的Postgresql ,「不存在」表現不佳。我說*「可能會更快」*,因爲相對速度取決於正在使用的數據庫。我建議OP在預測JOIN,NOT EXISTS或NOT IN是否最快之前,在真實數據上運行他的RDBMS解釋(或等價物)。 – 2011-05-10 20:42:01

相關問題