查找不为空的缺失记录

Find Missing records that are Not null

我有两个 table 的帐户信息。第一个 table T1 包含所有产品线的描述以及提交编号、名称、地区、状态、政策编号等等。第二个 table T2 只有 only for 属性 line 的相关信息及其提交编号、名称区域、状态、保单编号和其他。然后列名在 table 中的名称不同。

我需要比较两个 table 并在第二个 table T2 中找到 属性 行缺失的保单编号.我尝试了下面的代码并得到了列表,但我看到了空值。我应该如何从结果中消除这些空值?

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
    )

如果您想过滤掉 NULL 值,那么该过滤器应该进入 outer 查询,而不是 inner查询:

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.PolNoever NULL,那么 NOT IN 永远不会 return 为真。我的建议是使用 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]
                 );

请注意,如果 table 别名是 table 本身的缩写,我也认为查询更容易理解。

您可以将 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
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

如果您的结果是显示空列表的结果,您可以简单地使用 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) )

你试过左连接吗?

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 table 但 Global_Submission table

中不存在的保单编号