我有这个查询,但由于某种原因,StartDate值没有被过滤。它出什么问题了?请告诉我。
SELECT *
FROM TableA A
WHERE NOT EXISTS( SELECT * FROM TableB B
WHERE A.pId = B.pId and A.StartDate >= '20-JUN-10' )
答案 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',假设它是日期时间/日期列