【问题标题】:SQL Left Outer Join vs Inner Join Not equal toSQL Left Outer Join vs Inner Join 不等于
【发布时间】:2016-10-31 03:51:37
【问题描述】:

我想从表 A 中选择与以下查询不匹配的数据。 换句话说,我想要表 A 中的所有内容,但以下记录除外。 我假设它是一个左连接,但我收到的匹配比预期的要多得多。

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

【问题讨论】:

    标签: mysql sql-server join


    【解决方案1】:

    使用左连接并添加Where B.AnyField Is Null 正如评论的那样,B.AnyField 必须是没有 Null 的列,例如主键,否则您会得到误报。

    还要确保您的加入条件不允许重复,因为这会使您的号码丢失。

    【讨论】:

    • 补充:如果有匹配,确保选择的“AnyField”不能为空;通常通过选择主键字段或其他定义为 NOT NULL 的列。
    • 我在表 A 中有 293K 行,在表 B 中有 700 万行。内连接在 233k 上匹配。但该搜索结果超过 300k。我只想看看剩下的60k。
    • 您在 B 表中使用的字段必须为空值。请参阅我的更新答案。如果 B 中的该列没有空值,则不可能获得超过您所追求的 60k。
    • 糟糕,我的桌子放错了一边。非常感谢。
    【解决方案2】:

    除了左连接,您还必须检查 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
    

    【讨论】:

      猜你喜欢
      • 2015-01-10
      • 1970-01-01
      • 2016-04-28
      • 2014-08-10
      • 2013-05-02
      • 2020-08-31
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      相关资源
      最近更新 更多