SQL查询不存在

时间:2010-07-06 14:01:46

标签: sql sql-server sql-server-2005

我有这个查询,但由于某种原因,StartDate值没有被过滤。它出什么问题了?请告诉我。

SELECT *
FROM TableA A
WHERE NOT EXISTS( SELECT * FROM TableB B
                  WHERE A.pId = B.pId and A.StartDate >= '20-JUN-10' )

4 个答案:

答案 0 :(得分:2)

你的意思是?

SELECT *
FROM TableA A
WHERE A.StartDate >= '20-JUN-10'
AND NOT EXISTS( SELECT * FROM TableB B WHERE A.pId = B.pId )

StartDate条件放入NOT EXISTS - 子句应返回此条件 匹配的行。

答案 1 :(得分:2)

如果StartDate是一个varchar列,那么当你对它进行大于比较时,你不能指望得到正确的结果。实际上,您要说的是,存储在StartDate列中的任何值都不应在'20 -JUN-10'之后或之后排序。您应该使StartDate成为实际的DateTime。所以,在你这样做之前,你应该将它转换为DateTime,因为它只引用外部表,你可以将它从子查询中拉出来:

Select ..
From TableA As A
Where ( A.StartDate Is Null Or Cast(A.StartDate As DateTime) < '2010-06-20' )
    And Not Exists  (
                    Select 1
                    From TableB As B
                    Where B.pid = A.pid
                    )

StartDate不是实际的DateTime是数据完整性的一个基本问题,并且会产生这个问题以及我想象的其他一些问题。但是,如果由于某些疯狂的原因,您的值无法在StartDate列中强制转换为DateTime,那么您需要添加另一个检查(并将原始DBA打到头部):

Select ..
From TableA As A
Where ( A.StartDate Is Null 
    Or (IsDate(A.StartDate) = 1 And Cast(A.StartDate As DateTime) < '2010-06-20' ) )
    And Not Exists  (
                    Select 1
                    From TableB As B
                    Where B.pid = A.pid
                    )

答案 2 :(得分:1)

猜测,您可能需要修改括号:

SELECT * FROM TableA A
WHERE NOT EXISTS(SELECT * FROM TableB B WHERE A.pId = B.pId) 
 and A.StartDate >= '20-JUN-10'

答案 3 :(得分:0)

使用日期的ISO格式代替'20 -JUN-10'使用'20100610',假设它是日期时间/日期列

另见Setting a standard DateFormat for SQL Server