-1
votes

Problème de jointure sql, impossible de récupérer les enregistrements de la table a qui correspondent à une condition de la table b et les enregistrements restants de la table a

J'écris une requête SQL pour obtenir tous ces enregistrements de la table A qui correspondent à la table b avec certaines conditions, et tous les enregistrements laissés de côté de la table a, qui ne sont pas là dans la table b. Ci-dessous le code et les tableaux

Tableau A

skey   Ordername  
100       Pen (Because this is true in table B)
101       any 

Tableau b

skey    OrderName   Key
100     Pen        True
100     Cutter      



select a.skey,a.orderName
from Test_A a
     left join Test_B b
     on a.skey=b.skey
where b.kit='True' and a.orderName=b.orderName

Le résultat dont j'ai besoin est

skey    OrderName    
100     Pen     
100     Cutter  
101     any     


1 commentaires

Veuillez apprendre à marquer correctement votre question. MySQL et Oracle sont deux produits complètement différents. Lequel est-ce ???


3 Réponses :


1
votes

Voici l'idée:

select a.skey, a.orderName
from Test_A a left join
     Test_B b
     on a.skey = b.skey and
        a.orderName = b.orderName 
where b.kit = 'True' or   -- matches and value is true
      b.skey is null.     -- no match


1 commentaires

Merci de répondre . Mais le fait est que si la table b a 2 valeurs et que rien de tout cela n'a la clé comme vrai, alors j'ai besoin des deux valeurs dans le résultat. Est-ce possible ?



1
votes

Vous pouvez essayer ci-dessous -

select a.skey,a.orderName from Test_A a
left join Test_B b
on a.skey=b.skey  and a.orderName=b.orderName
where b.kit='True' and b.skey is null


0 commentaires

1
votes

Vous pouvez utiliser NOT EXISTS dans la clause WHERE comme ceci:

> skey | OrderName
> ---: | :--------
>  100 | Pen      
>  101 | any      

Ou sans jointure:

SELECT a.* 
FROM Test_A a 
WHERE EXISTS (SELECT 1 FROM Test_B b WHERE b.skey = a.skey AND b.OrderName = a.OrderName AND b.kit = 'True') 
OR NOT EXISTS (SELECT 1 FROM Test_B b WHERE b.skey = a.skey AND b.kit = 'True')

Voir la démo .
Résultats:

SELECT a.* 
FROM Test_A a LEFT JOIN Test_B b
ON b.skey = a.skey AND b.OrderName = a.OrderName 
WHERE b.kit = 'True'
   OR (b.kit IS NULL AND NOT EXISTS (SELECT 1 FROM Test_B WHERE skey = a.skey AND kit = 'True'))


0 commentaires