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)
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
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)
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
).