不存在多于一列
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)
【讨论】:
以上是关于不存在多于一列的主要内容,如果未能解决你的问题,请参考以下文章