查找不为空的缺失记录
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.PolNo
是 ever 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
中不存在的保单编号
我有两个 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.PolNo
是 ever 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
中不存在的保单编号