2010-07-06 6 views
2

J'ai cette requête mais, pour une raison quelconque, les valeurs StartDate ne sont pas filtrées. Qu'est ce qui ne va pas avec ça? S'il vous plaît, faites-moi savoir.La requête SQL n'existe pas

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

Quelle est votre SGBD ? Quel est le type de colonne StartDate? Un peu plus d'informations aiderait beaucoup ... –

+0

Cela peut avoir à faire avec le type de votre colonne StartDate, quel est le type de données pour cela? –

+0

C'est un type de données Varchar. J'utilise SQL Server 2005. – nav100

Répondre

2

Si StartDate est une colonne varchar, alors vous ne pouvez pas vous attendre à obtenir des résultats corrects lorsque vous faites des comparaisons plus que sur elle. En effet, vous dites que toutes les valeurs qui seraient stockées dans la colonne StartDate ne devraient pas être triées après ou sur '20 -JUN-10 '. Vous devriez faire de StartDate un DateTime réel. Donc, jusqu'à ce que vous faites cela, vous devriez jeter un DateTime et puisqu'il fait référence que la table externe, vous pouvez le retirer de la sous-requête:

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 
        ) 

Ce StartDate n'est pas une DateTime réelle est un élément fondamental problème de l'intégrité des données et crée ce problème avec une foule d'autres que j'imagine. Cependant, si pour une raison folle vous avez des valeurs qui ne peuvent être exprimées à un DateTime dans votre colonne StartDate, alors vous devez ajouter un autre chèque (et claque la hausse DBA originale la tête):

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

Notez que cela entraînera des problèmes SI A.StartDate autorise les valeurs NULL ou contient des données qui ne peuvent pas être converties en date/heure. – NotMe

+0

@Chris Lively - J'ai corrigé le problème avec Nulls. Le problème avec les conversions invalides à date-heure est un problème plus important en termes d'intégrité des données fondamentales. Par exemple, pourquoi une colonne appelée StartDate n'est-elle pas typée DateTime? – Thomas

+0

Merci pour votre aide. – nav100

2

Voulez-vous dire cela?

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

Mettre la condition avec StartDate dans le NOT EXISTS -clause doit retourner ces lignes où ce critère est pas adapté.

+0

merci pour la réponse. C'est le type de données varchar et j'utilise le serveur SQL 2005. – nav100

+0

@ nav100: J'ai modifié vos tags pour refléter cela. Vous ne savez pas pourquoi vous stockez une date dans une colonne 'VARCHAR', mais est-ce que ma requête a aidé? –

+0

Dois-je utiliser une convesrion? – nav100

1

Lors d'une estimation, vous devrez peut-être réviser votre parenthèse:

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