2015-05-29 54 views
2

請告訴我爲什麼這不起作用:查找一個表中沒有的其他行 - SQL Server查詢

SELECT t1.id 
FROM table1 t1 
where t1.id not in 
(select t2.id 
from table2 t2 
where t2.somedate between '2015-01-01 00:00:00' and '2015-04-30 23:59:59' 
) 
group by t1.id 

子查詢的作品和第一選擇作品,但是當我運行整個事情說到空白。

我想在一張表中找到不在另一張表中的記錄(ID)。

任何幫助將不勝感激。 這是在SQL Server btw上。

感謝

+0

我一直在使用「不」有同樣的問題。這可能是sqlserver中的一個bug,或者是我不瞭解的一些東西。按照建議使用左連接。也許「不存在」作品,不太記得。如果有人有任何意見,爲什麼「不在」不起作用,我很樂意聽到它。 – Tobb

+0

您的子查詢是否返回任何NULL值? –

+0

這是由於在表中NULL ID,你可以使用不存在/左連接(請參閱下面的答案)/轉換Null類似「-1」。 – Anil

回答

1

您可以使用左連接

SELECT t1.id 
FROM table1 t1 
Left Join table2 t2 on T2.Id=t1.id and 
t2.somedate between '2015-01-01 00:00:00' and '2015-04-30 23:59:59' 
where t2.id is null group by t1.id 

另一種選擇是使用exists

select 
    t1.id 
from 
    table1 t1 
where 
    not exists 
    (select 1 from table2 t2 where t1.id = t2.id and 
    t2.somedate between '2015-01-01 00:00:00' and '2015-04-30 23:59:59' 
    and t2.id is null group by t1.id) 
+1

這很好,非常感謝。這兩個工作,並給出相同的結果。順便說一句,在第二個查詢日期後,你有'在哪裏' - 這應該是'和':) – Imm

+0

@Imm: - 不客氣! –

+0

@Imm: - 更新! –

0

使用LEFT JOIN

SELECT t1.id 
FROM table1 t1 
Left Join table2 t2 on T2.Id=t1.id and 
t2.somedate between '2015-01-01 00:00:00' and '2015-04-30 23:59:59' 
where t2.id is null 
group by t1.0 

或者您的查詢更新

SELECT t1.id 
FROM table1 t1 
where isnull(t1.id,-1) not in 
(select isnull(t2.id,-1) 
from table2 t2 
where t2.somedate between '2015-01-01 00:00:00' and '2015-04-30 23:59:59' 
) 
group by t1.id 
+0

非常感謝Anil,這兩項工作都很棒。 – Imm

相關問題