0
votes

Obtenez des enregistrements qui n'ont qu'un seul disque dans une table étrangère avec condition donnée

J'ai des contrats et des territoires Tableau. Ils partagent une relation à plusieurs . J'essaie de créer une requête pour obtenir tous les contrats uniquement en Chine. Cela me rappellerait essentiellement tous les records de contrats pour lesquels il n'y a qu'un seul enregistrement correspondant dans la table des territoires avec nom 'Chine'

Si possible, je voudrais le faire sans groupe. Parce que pour simplifier la question que je n'ai pas inclus d'autres choses compliquées qui finiront par faire partie de cela.

étant donné les données d'échantillonnage suivantes. Je voudrais obtenir uniquement le contrat4 à la suite: xxx


3 commentaires

Veuillez ajouter des exemples de données à votre question pour les deux tables, ainsi que la sortie attendue.


Dis que vous avez des contrats5 sans enregistrement dans la table des territoires (est-ce possible?); Si oui, devrait-on contracter5 être extrait ou non?


Ce n'est pas un tableau des territoires, c'est un tableau des contrats-territoires mettant en œuvre une relation nombreuses à plusieurs entre contrats et territoires. Si c'était une table de territoires, il n'aurait pas deux rangées pour le Japon et l'Inde et trois pour la Chine.


4 Réponses :


0
votes

Voici une solution possible utilisant joindre et partition : xxx


1 commentaires

Cette syntaxe a l'air bien pour Oracle. Au fait, PL / SQL est le langage de programmation - Oracle SQL s'appelle "Oracle SQL" ou "SQL" pour Short :)



0
votes

Essayez comme ci-dessous en utilisant la sous-requête corrélée

   select c.*,t.* from contracts c join territories t 
    on c.Id = t.contract_id 
    where  exists ( select 1 from territories t1 
                      where t1.contract_id=t.contract_id
                      having count(distinct name)=1

                     ) and t.name='china'


0 commentaires

0
votes

Vous pouvez utiliser ci-dessous

select c.* from contracts c join territories t 
    on c.Id = t.contract_id 
    where not exists ( select 1 from territories t1 
                      where t1.contract_id=t.contract_id
                      and t1.name <> 'china'

                     ) and t.name='china'


0 commentaires

0
votes

Si tous les contrats ont un territoire, vous pouvez simplement faire:

select c.*
from contracts c
where not exists (select 1
                  from territories t
                  where t.contract_id = c.contract_id and
                        t.country <> 'china'
                 ) and
      exists (select 1
              from territories t
              where t.contract_id = c.contract_id and
                    t.country = 'china'
             );


0 commentaires