不存在多于一列

Posted

技术标签:

【中文标题】不存在多于一列【英文标题】:Not Exists With more than one column 【发布时间】:2014-02-24 20:18:01 【问题描述】:

我正在编写一个查询,该查询将根据加载日期读取一个表中的数据。主要过程是检查从最近的加载日期与整个表的历史记录相比,是否有任何内容添加到表中。我遇到的问题是在对多个列使用“不存在”语句时。它检查指定的列是否单独存在而不是作为一组列存在。正如下面代码中列出的那样,SQL 正在检查表之间是否存在姓氏、名字和中间名,而不是全部作为一个(几乎就像它在表中使用“OR”而不是“AND”第二个查询。有什么建议,还是我应该走另一条路?

SELECT DISTINCT
        [Last Name] ,
        [First Name] ,
        [Middle Name]
INTO    #B
FROM    A
WHERE   Load_Date = ( SELECT    MAX(Load_Date)
                      FROM      A
                    )

SELECT DISTINCT
        [Last Name] ,
        [First Name] ,
        [Middle Name]
FROM    A
WHERE   NOT EXISTS ( SELECT [Last Name] ,
                            [First Name] ,
                            [Middle Name]
                     FROM   #B B
                     WHERE  A.[Last Name] = B.[Last Name]
                            AND A.[First Name] = B.[First Name]
                            AND A.[Middle Name] = B.[Middle Name] )
        AND Load_Date <> ( SELECT   MAX(Load_Date)
                           FROM     A
                         )

【问题讨论】:

NOT EXISTS 不关心您实际选择的是什么,它只关心是否返回了行。所以实际上你可以把它改成SELECT NULL,它什么都不会改变 【参考方案1】:

您似乎想要获取上次加载中没有的名称组合。这是一种更简单的方法:

Select [Last Name], [First Name], [Middle Name]
from A
group by [Last Name], [First Name], [Middle Name]
having max(Load_Date) < (Select Max(Load_Date) From A);

您的查询应该有效。我想你误解了not exists 的工作原理。

【讨论】:

【参考方案2】:
SELECT [Last Name], [First Name], [Middle Name]
FROM A
WHERE [Load_Date] = (SELECT MAX([Load_Date]) From A)
EXCEPT
SELECT [Last Name], [First Name], [Middle Name]
FROM A
WHERE [Load_Date] <> (SELECT MAX([Load_Date]) From A)

【讨论】:

以上是关于不存在多于一列的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL“列不存在”但它确实存在

Postgres 列不存在

列不存在 Laravel 工厂

错误:“行/列不存在数据”使用 OdbcDataReader

如果列不存在,则无法添加?

Django:DatabaseError 列不存在