21

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

テーブルSHOPと別のテーブルLOCATIONがあると仮定します。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データベース)

4

3 に答える 3

29

'S.No'と'L.KEY'でGROUPする必要があります

SELECT S.NO, L.KEY 
FROM SHOP S 
LEFT OUTER JOIN LOCATN L 
ON S.NO = L.SHOP
GROUP BY S.NO, L.KEY
于 2010-03-28T14:59:26.463 に答える
7

シナリオの更新に続いて編集

単純なサブクエリでこれを実行できるはずだと思います(ただし、これは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)
于 2010-03-28T14:58:39.557 に答える
6

私もこの問題を抱えていましたが、TEXTタイプのフィールドも返していたため、GROUPBYを使用して修正できませんでした。(DISTINCTの使用についても同じです)。

このコードは私に重複を与えました:

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

このように書き直して修正しました。

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 

ご覧のとおり、2番目のテーブル()内のデータは気にしませんでしたがthing_y、その中にゼロより大きい一致があったかどうかだけrpt_idです。(FYI:rpt_id1番目のテーブルの主キーでもありませんでしたmaster_x)。

于 2012-12-11T17:16:21.183 に答える