【问题标题】:Find Missing records that are Not null查找不为空的缺失记录
【发布时间】:2017-05-05 20:54:06
【问题描述】:

我有两个帐户信息表。第一个表 T1 包含所有产品线的描述以及提交编号、名称、地区、状态、保单编号等。第二个表T2只有与仅适用于财产线相关的信息及其提交编号、名称区域、状态、保单编号等。然后列名在两个表中的名称不同。

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

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
    )

【问题讨论】:

  • 您不只是希望您的不在(选择 b.PolNo... 进入(选择...?您是说 a.[Master Policy Number] 不为空))所以你正在寻找那些为空的

标签: sql notnull


【解决方案1】:

你试过左连接吗?

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 表中的保单编号

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果您想过滤掉 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曾经 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]
                       );
      

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

      【讨论】:

      • 你在Is Not Null之后多了一个括号
      【解决方案4】:
      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
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 这行得通。太感谢了。如果我需要使用更多过滤器,我需要在子查询之外使用吗?说以防万一,我需要产品子行也只是“属性”,状态应该是“绑定”
        • 是的,使用主查询。
        猜你喜欢
        • 1970-01-01
        • 2020-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多