我有这个查询,但由于某种原因,StartDate值没有得到过滤。它出什么问题了?请告诉我。SQL查询不存在
SELECT *
FROM TableA A
WHERE NOT EXISTS(SELECT * FROM TableB B
WHERE A.pId = B.pId and A.StartDate >= '20-JUN-10')
我有这个查询,但由于某种原因,StartDate值没有得到过滤。它出什么问题了?请告诉我。SQL查询不存在
SELECT *
FROM TableA A
WHERE NOT EXISTS(SELECT * FROM TableB B
WHERE A.pId = B.pId and A.StartDate >= '20-JUN-10')
如果起始日期是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
)
这起始日期是不是一个实际的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
)
您的意思是?
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
-clause应该返回那些行,其中这个标准是不匹配。
在猜测,你可能需要修改你的括号:
SELECT * FROM TableA A
WHERE NOT EXISTS(SELECT * FROM TableB B WHERE A.pId = B.pId)
and A.StartDate >= '20-JUN-10'
的日期使用ISO格式,所以不是'20 -Jun-10' 使用‘20100610’假定它是一个日期时间/日期列
什么是你的DBMS ?什么是StartDate列类型? 多一点信息会帮助很多... – 2010-07-06 14:04:26
它可能与您的StartDate列的类型有关,这是什么数据类型? – 2010-07-06 14:06:25
这是一个Varchar数据类型。我正在使用SQL Server 2005. – nav100 2010-07-06 14:11:46