Requete SQL sur jointure test d'égalité et pas de contenance
Le cas est le suivant :
J'ai une table T3_TABLE_A2 et une jointure T3_JOIN_A2_A2 qui permet aux objets de la table T3_TABLE_A2 de pointer vers eux-mêmes.
Auparavant il y avait 1 seul champ PK sur la table T3_TABLE_A2 donc je m'en sortais, mais maintenant il y a 2 PK et ca se complique grandement (pour moi).
je veux les objets de T3_TABLE_A2 qui pointent (à travers la jointure)à vers un objet de T3_TABLE_A2 précis (0,0) ici pour simplifier.
J'encode avec un moteur ainsi :
Code:
1 2 3 4 5 6 7
|
select distinct T3_TABLE_A2.ID, T3_TABLE_A2.SITE_ID
from T3_TABLE_A2, T3_JOIN_A2_A2
where (((T3_JOIN_A2_A2.ID1=(T3_TABLE_A2.ID))
and (T3_JOIN_A2_A2.SITE_ID1=(T3_TABLE_A2.SITE_ID)))
and ((T3_JOIN_A2_A2.ID2=0)
and (T3_JOIN_A2_A2.SITE_ID2=0))) |
Ca "marche" mais me retourne trop de résultats : cela retourne tous les T3_TABLE_A2 qui CONTIENNENT mon objet cible (0,0) mais pas qui sont en EGALITE avec cette cible. Ceux qui pointent vers la cible + d'autres valeurs sont aussi retournés (j'ai un filtre contient au lieu d'égale).
Avec la double clé je ne vois pas trop comment faire : le code ci-dessous ne marche pas (aucun résultat) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
select distinct T3_TABLE_A2.ID, T3_TABLE_A2.SITE_ID
from T3_TABLE_A2, T3_JOIN_A2_A2
where (((T3_JOIN_A2_A2.ID1=(T3_TABLE_A2.ID))
and (T3_JOIN_A2_A2.SITE_ID1=(T3_TABLE_A2.SITE_ID)))
and ((T3_JOIN_A2_A2.ID2=0)
and (T3_JOIN_A2_A2.SITE_ID2=0))
and not exists (select *
from T3_TABLE_A2, T3_JOIN_A2_A2
where (((T3_JOIN_A2_A2.ID1=(T3_TABLE_A2.ID))
and (T3_JOIN_A2_A2.SITE_ID1=(T3_TABLE_A2.SITE_ID)))
and ((T3_JOIN_A2_A2.ID2<>0)
or (T3_JOIN_A2_A2.SITE_ID2<>0))))) |
avec une seule ID j'encodais ainsi :
Code:
1 2 3
|
select distinct T3_TABLE_A.ID from T3_TABLE_A where
(((ID in (select ID1 from T3_JOIN_A_A where (ID2=1))) and not exists (select ID1 from T3_JOIN_A_A LY_5 where (ID2<>1) and (ID=ID1)))) |
et ca marchait
Des idées ?
Merci
Complément pour Oracle et MySql
Pour info j'ai aussi ca qui semble marcher sur Oracle et MySql avec un NOT IN au lieu d'un MINUS
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
SELECT t.id, t.site_id
FROM T3_TABLE_A2 t, T3_JOIN_A2_A2 j
WHERE j.id1 = t.ID
AND j.site_id1 = t.site_id
AND j.id2 = 0
AND j.site_id2 = 0
and (t.id, t.site_id) NOT IN (
SELECT t.id, t.site_id
FROM T3_TABLE_A2 t, T3_JOIN_A2_A2 j
WHERE j.id1 = t.ID
AND j.site_id1 = t.site_id
AND ( j.id2 <> 0
OR j.site_id2 <> 0)) |