2010-07-06 90 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'