2016-12-20 54 views
0

我有兩個帳戶信息表。第一張表T1有所有產品線的描述以及提交號碼,名稱,地區,狀態,政策編號等等。第二張表T2只有與關聯的信息僅適用於物業專線以及其提交編號,名稱區域,狀態,保單編號和其他信息。然後列名在兩個表中都有不同的名稱。查找缺失的記錄不爲空

我需要比較這兩個表,找到第二個表T2中的Property行的缺少策略編號。我試着下面的代碼,我得到的列表,但我看到空值。我應該如何從結果中消除這些空值?

SELECT a.[Master Policy Number] 
FROM DB1.dbo.Global_Submission_Log AS a 
WHERE 
    a.[Master Policy Number] NOT IN (
     SELECT b.PolNo 
     FROM DB1.dbo.PROPERTY_Files AS b 
     WHERE b.PolNo = a.[Master Policy Number] 
      AND a.[Master Policy Number] IS NOT NULL 
    ) 
+0

難道你不希望你的不在(選擇b.PolNo ...是在政策編號(選擇...?你說的是[主策略號碼]不是空的,所以你找到的是空的 – user1628733

回答

2

您可以將is not null移到子查詢之外。您已經有一個=條件,它將排除空值。

Select a.[Master Policy Number] 
From DB1.dbo.Global_Submission_Log a 
Where a.[Master Policy Number] Not In (Select b.PolNo 
             From DB1.dbo.PROPERTY_Files b 
             Where b.PolNo = a.[Master Policy Number]) 
And a.[Master Policy Number] Is Not Null 
+0

這個工作,非常感謝。如果我需要使用更多的過濾器,是否需要在子查詢之外使用?假如我需要產品子行也只是「屬性」並且狀態應該是「綁定」 – Shasti

+0

是的,使用主查詢。 – JohnHC

0

如果您想篩選出NULL值,則該過濾器應該在查詢,而不是在查詢:

Select a.[Master Policy Number] 
From DB1.dbo.Global_Submission_Log a 
Where a.[Master Policy Number] Is Not Null and 
     a.[Master Policy Number] Not In (Select b.PolNo 
             From DB1.dbo.PROPERTY_Files b 
             Where b.PolNo = a.[Master Policy Number] 
             ); 

哦,這是很奇怪的。您正在比較相關條款中使用的NOT IN中的相同列。出於這個原因和NOT IN的語義,你應該只使用NOT EXISTS來代替。

我應該注意,帶子查詢的NOT IN是危險的。如果b.PolNo有史以來NULL,那麼NOT IN永遠不會返回true。我的建議是使用NOT EXISTS代替:

Select gsl.[Master Policy Number] 
From DB1.dbo.Global_Submission_Log gsl 
Where gsl.[Master Policy Number] Is Not Null and 
     not exists (select 1 
        from DB1.dbo.PROPERTY_Files pf 
        where pf.PolNo = gsl.[Master Policy Number] 
       ); 

請注意,我也認爲查詢是更容易執行,如果表的別名是表本身的縮寫。

+0

'Is Not Null'後有一個額外的空白符號 – Kateract

1
Select a.[Master Policy Number] 
From DB1.dbo.Global_Submission_Log a 
Where a.[Master Policy Number] Not In (Select b.PolNo 
From DB1.dbo.PROPERTY_Files b 
Where b.PolNo = a.[Master Policy Number] 
) 
/* filter nulls on main query */ And a.[Master Policy Number] Is Not Null 
0

如果結果是顯示了空的列表中的一個,你可以簡單地使用delete from刪除的結果。

delete from DB1.dbo.Global_Submission_Log Where [Master Policy Number] in ( Select a.[Master Policy Number]From DB1.dbo.Global_Submission_Log a Where a.[Master Policy Number] Not In (Select b.PolNo From DB1.dbo.PROPERTY_Files b Where b.PolNo = a.[Master Policy Number] And a.[Master Policy Number] Is Not Null) )

0

你嘗試左連接?

Select T1.[Master Policy Number] 
From DB1.dbo.Global_Submission_Log T1 
LEFT JOIN DB1.dbo.PROPERTY_Files T2 
ON T1.[Master Policy Number] on T2.PolNo 
Where b.PolNo IS NULL 

這會爲您提供不存在於Property_Files表,但在Global_Submission表