web-dev-qa-db-ja.com

LEFT OUTER JOINから重複を削除

私の質問は LEFT JOINの制限 によく似ていますが、バリエーションがあります。

テーブルSHOPと別のテーブルLOCATIONがあると仮定します。場所は、SHOPテーブルの一種の子テーブルであり、2つの対象列があります。1つは部門キー(単にKEYと呼ばれる)と「SHOP」番号です。これは、表SHOPの番号「NO」と一致します。

私はこの左外部結合を試しました:

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

しかし、1つのショップに属する場所はたくさんあるため、重複が多くなっています。それらを削除し、重複しない「ショップ、キー」エントリのリストを取得するだけです。

データは正しいが、重複は次のように表示されます。

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

代わりに、データを次のように表示したいと思います。

SHOP     KEY
 1       XXX
 2       YYY
 3       ZZZ  etc.

SHOPテーブル:

 NO
 1       
 2       
 3       

LOCATIONテーブル:

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

(Oracle 10gデータベース)

19
Kaushik Gopal

「S.No」と「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

[〜#〜] edit [〜#〜]シナリオの更新を追跡する

簡単なサブクエリでこれを実行できるはずだと思います(ただし、Oracleデータベースに対してこれをテストしたことはありません)。次のようなもの

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

上記は、複数の部門にある場所に店舗が関連付けられている場合にエラーを発生させます。

この可能性を単に無視し、そのイベントで任意のものを選択したい場合は、使用できます

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