2014-05-09 24 views
0

我有兩個表。如何從一個表中選擇不存在於第二個表中的記錄

T1
IDWorker
名稱

T2
IDWorker


因子

現在我必須讓所有工人ŧ對於給定的月份和年份,帽子不在T2中。

這是我的查詢:

SELECT 
    `T1`.`IDWorker`, 
    `T1`.`Name`, 
    `T1`.`LastName`, 
    `T2`.`Month`, 
    `T2`.`Year` 
    `T2`.`Factor` 
FROM 
    `T1` 
    LEFT JOIN `T2` ON `T1`.`IDWorker` = `T2`.`IDWorker` 
WHERE 
    `T2`.`Month` = 4 AND 
    `T2`.`Year` = 2014 AND 
    `T2`.`IDWorker` IS NULL; 

運行此查詢我得到空的結果,但不包括月份和年份的標準,我得到工人的名單。我需要的結果顯示了在給定期間內沒有進入T2的所有工人。

回答

1

我會做

SELECT * FROM t1 
WHERE IDWorker NOT IN (SELECT IDWorker 
         FROM T2 
         WHERE Month = 4 
         AND Year = 2014) 
1

NOT EXISTS

SELECT 
    `t`.`IDWorker`, 
    `t`.`Name`, 
    `t`.`LastName`, 
    `T2`.`Month`, 
    `T2`.`Year` 
    `T2`.`Factor` 
FROM 
    `T1` t 
WHERE NOT EXISTS 
(
SELECT 1 FROM `T2` 
WHERE 
    `T2`.`Month` = 4 AND 
    `T2`.`Year` = 2014 AND 
`t`.`IDWorker` = `T2`.`IDWorker` 
) 

或者其他方式嘗試添加您的地方在ON()條款

SELECT 
    `T1`.`IDWorker`, 
    `T1`.`Name`, 
    `T1`.`LastName`, 
    `T2`.`Month`, 
    `T2`.`Year` 
    `T2`.`Factor` 
FROM 
    `T1` 
    LEFT JOIN `T2` ON `T1`.`IDWorker` = `T2`.`IDWorker` AND 
    `T2`.`Month` = 4 AND 
    `T2`.`Year` = 2014 
WHERE 
    `T2`.`IDWorker` IS NULL; 

表2的條件下通過LEFT JOIN/IS NULL vs. NOT IN vs. NOT EXISTS: nullable columns還去性能因子

+0

我試着用第二個查詢,它的工作原理。但是,如果我輸入不同的月份,例如5我也會得到工人名單,即使沒有第5個月的記錄。 – Josef

+0

是的,它會爲您提供那段時間內沒有進入的用戶,我想這也是您在問題中提出的問題 –

0

通過編寫T2.IDWorker IS NULL來查詢您的查詢,可以將僅可加入到具有IDWorker = NULL的T2記錄的T2記錄集合限制爲只加入該記錄。解決它的方法是創建一個子查詢,將做第一個加入,然後應用過濾器的結果,即:

SELECT IDWorker, Name, LastName 
FROM (SELECT 
     T1.IDWorker, 
     T1.Name, 
     T1.LastName, 
     T2.IDWorker 'IDWorker2' 
    FROM 
     T1 LEFT JOIN T2 ON T1.IDWorker = T2.IDWorker 
    WHERE 
     T2.Month = 4 AND 
     T2.Year = 2014) subquery 
WHERE IDWorker2 IS NULL 

注:由於在T2的記錄不會在最終的存在結果,沒有一點要打印空對月,年和因子所以我刪除它

解決方案通過sdespoint也將工作建議,但(尤其是對於大型數據集與指標支持IDWorker)可以從更壞苦性能比上面的選項。

相關問題