SQL pas à l'article
-
25-09-2019 - |
Question
J'ai une question qui ne fonctionne pas comme prévu
Q1:
SELECT id, name
FROM vw_x
WHERE id NOT IN (select pid from table_x)
GROUP BY id, name
Having max(c_date) > GETDATE()
Q2:
SELECT id, name
FROM vw_x
GROUP BY id, name
Having max(c_date) > GETDATE()
Q1 est rien de retour, même si je sais que ces ids ne sont pas en table_x Q2 fonctionne correctement sans NOT IN
Qu'est-ce qui pourrait être mal avec ma requête?
La solution
vous avez une valeur NULL dans la table
essayer
SELECT id, name
FROM vw_x
WHERE id NOT IN (select pid from table_x where pid is not null)
GROUP BY id, name
Having max(c_date) > GETDATE()
ou ce
SELECT id, name
FROM vw_x
WHERE NOT EXISTS (select 1 from table_x where pid = vw_x.id )
GROUP BY id, name
Having max(c_date) > GETDATE()
Voir aussi Sélectionner toutes les lignes d'une table qui n'existent pas dans une autre table
Autres conseils
Qu'en est-il en utilisant une jointure gauche?
SELECT id, name
FROM vw_x
LEFT JOIN table_x on id = pid
WHERE pid IS NULL
GROUP BY id, name
Having max(c_date) > GETDATE()
Il y a une autre situation: la sous-requête peut retourner rien. SQL Server ne fonctionne pas comme prévu si la clause NOT IN retourne une liste nulle. J'ai une requête comme suit:
select * from table where id not in (select id from tableB where somecondition(x))
Lorsque la sous-requête contient une liste des ids, la requête renverra les données comme prévu. Mais quand la sous-requête ne renvoie rien, la requête renverra toujours les données, mais devient alors bloqué.
J'ai changé la requête à ce qui suit et résolu le problème:
select * from table where id not in (select id from tableB where somecondition(x) **union all select 0**)
ce qui fait que la sous-requête contiendra au moins un numéro.