web-dev-qa-db-fra.com

Supprimer les doublons de LEFT OUTER JOIN

Ma question est assez similaire à Restreindre un LEFT JOIN , avec une variation.

En supposant que j'ai une table SHOP et une autre table LOCATION. L'emplacement est une sorte de table enfant de la table SHOP, qui a deux colonnes d'intérêt, l'une est une clé de division (en l'appelant simplement KEY) et un numéro "SHOP". Cela correspond au numéro "NO" dans le tableau SHOP.

J'ai essayé cette jointure externe gauche:

SELECT S.NO, L.KEY
FROM SHOP S
LEFT OUTER JOIN LOCATN L ON S.NO = L.SHOP

mais je reçois beaucoup de doublons car il existe de nombreux emplacements qui appartiennent à un seul magasin. Je veux les éliminer et obtenir simplement une liste des entrées "boutique, clé" sans doublons.

Les données sont correctes mais les doublons apparaissent comme suit:

SHOP     KEY
 1       XXX
 1       XXX
 2       YYY
 3       ZZZ
 3       ZZZ  etc.

J'aimerais que les données apparaissent comme ceci à la place:

SHOP     KEY
 1       XXX
 2       YYY
 3       ZZZ  etc.

Table SHOP:

 NO
 1       
 2       
 3       

Table LOCATION:

 LOCATION   SHOP  KEY
   L-1       1    XXX   
   L-2       1    XXX   
   L-3       2    YYY   
   L-4       3    YYY   
   L-5       3    YYY   

(Base de données Oracle 10g)

19
Kaushik Gopal

Vous devez GROUPER PAR 'S.No' et 'L.KEY'

SELECT S.NO, L.KEY 
FROM SHOP S 
LEFT OUTER JOIN LOCATN L 
ON S.NO = L.SHOP
GROUP BY S.NO, L.KEY
25
SoftwareGeek

MODIFIER Suite à la mise à jour dans votre scénario

Je pense que vous devriez être en mesure de le faire avec une simple sous-requête (même si je n'ai pas testé cela par rapport à une base de données Oracle). Quelque chose comme ce qui suit

UPDATE shop s
SET divnkey = (SELECT DISTINCT L.KEY FROM LOCATN L WHERE S.NO = L.SHOP)

Ce qui précède générera une erreur dans le cas où une boutique serait associée à des emplacements qui sont dans plusieurs divisions.

Si vous voulez simplement ignorer cette possibilité et en sélectionner une arbitraire dans ce cas, vous pouvez utiliser

UPDATE shop s
SET divnkey = (SELECT MAX(L.KEY) FROM LOCATN L WHERE S.NO = L.SHOP)
7
Martin Smith

J'ai aussi eu ce problème mais je n'ai pas pu utiliser GROUP BY pour le résoudre car je retournais également des champs de type TEXT. (Il en va de même pour l'utilisation de DISTINCT).

Ce code m'a donné des doublons:

select mx.*, case isnull(ty.ty_id,0) when 0 then 'N' else 'Y' end as inuse 
from master_x mx 
left outer join thing_y ty on mx.rpt_id = ty.rpt_id

Je l'ai corrigé en le réécrivant ainsi:

select mx.*, 
case when exists (select 1 from thing_y ty where mx.rpt_id = ty.rpt_id) then 'Y' else 'N' end as inuse
from master_x mx 

Comme vous pouvez le voir, je me fichais des données du 2e tableau (thing_y), juste s'il y avait plus de zéro correspondances sur le rpt_id à l'intérieur. (Pour info: rpt_id n'était pas non plus la clé primaire de la 1ère table, master_x).

6
woodge