2010-07-06 94 views
2

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

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

什么是你的DBMS ?什么是StartDate列类型? 多一点信息会帮助很多... – 2010-07-06 14:04:26

+0

它可能与您的StartDate列的类型有关,这是什么数据类型? – 2010-07-06 14:06:25

+0

这是一个Varchar数据类型。我正在使用SQL Server 2005. – nav100 2010-07-06 14:11:46

回答

2

如果起始日期是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 
        ) 
+0

请注意,这会导致问题IF A.StartDate允许空值或具有无法转换为日期时间的数据。 – NotMe 2010-07-06 14:39:43

+0

@Chris Lively - 我已经纠正了这个问题。对于基础数据完整性而言,无效转换日期时间是一个更大的问题。也就是说,为什么名为StartDate的列没有输入为DateTime? – Thomas 2010-07-06 14:49:44

+0

感谢您的帮助。 – nav100 2010-07-06 14:52:39

2

您的意思是?

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

把条件与StartDateNOT EXISTS -clause应该返回那些行,其中这个标准是不匹配。

+0

感谢您的回复。它是varchar数据类型,我使用的是SQL server 2005. – nav100 2010-07-06 14:12:40

+0

@ nav100:我编辑了你的标签以反映这一点。不知道为什么你在'VARCHAR'列中存储日期,但我的查询有帮助吗? – 2010-07-06 14:16:23

+0

我必须使用任何convesrion? – nav100 2010-07-06 14:19:39

1

在猜测,你可能需要修改你的括号:

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