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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top