2016-06-28 101 views
1

我想从表A中选择不符合以下查询的数据。 换句话说,我希望除表格A以外的所有内容除了以下记录。我假设它是一个左连接,但我收到比预期更多的匹配。SQL左外连接vs内连接不等于

SELECT distinct 
    a.Address_Direction, 
    a.Address_Extension, 
    a.Address_Number, 
    a.Address_Root, 
    a. PHY_ADDR1, 
    b.PHY_ADDR1 
FROM [RD_GeoCode].[dbo].[PA_Stg_Test2] AS a 
inner JOIN [RD_GeoCode].[dbo].[rg_ApplicationData_AllForms_20160401_address] AS b ON 
B.address_direction = a.address_direction 
and B.address_root = a.address_root 
and B.address_number = a.address_number 
and B.Address_Extension = a.Address_Extension 
and b.PHY_ZIPCD = a.PHY_ZIPCD 

回答

2

使用左连接,并添加Where B.AnyField Is Null至于评论,B.AnyField必须像一个主键没有空值的列,否则你会得到误报。

此外请确保您的连接条件不允许重复,因为这将抛出您的号码。

+1

要添加到:确保选择“AnyField”不能为空如果有匹配;通常通过选择主键字段或其他一些定义为NOT NULL的列。 – Uueerdo

+0

我在表A中有293K行,在表B中有700万行。内部连接符合233k。但是这个搜索结果超过了30万。我只想看看剩下的60k。 – ObiWanCannoli

+0

您在B表中使用的字段必须为空值。看到我更新的答案。如果B中的这个列没有空值,那么不可能获得超过60k的值。 –

0

随着左连接,你必须检查B的相应条目是否为空。请尝试以下查询:

SELECT distinct a.Address_Direction, a.Address_Extension, a.Address_Number, a.Address_Root, a. PHY_ADDR1, b.PHY_ADDR1 
FROM [RD_GeoCode].[dbo].[PA_Stg_Test2] AS a 
LEFT JOIN [RD_GeoCode].[dbo].[rg_ApplicationData_AllForms_20160401_address] AS b ON 
B.address_direction = a.address_direction 
AND B.address_root = a.address_root 
AND B.address_number = a.address_number 
AND B.Address_Extension = a.Address_Extension 
AND b.PHY_ZIPCD = a.PHY_ZIPCD 
WHERE B.address_number IS NULL