2017-11-12 9 views
0

クエリに問題があります。私は3つのテーブルを持っています。フラグ行に重複値があります

table A 
    ---------------------------- 
    NAME | CODE 
    ---------------------------- 
    bob | PL 
    david | AA 
    susan | PL 
    joe | AB 
    alfred | PL 



table B 
    ---------------------------- 
    CODE | DESCRIPTION 
    ---------------------------- 
    PL | code 1 
    PB | code 2 
    PC | code 3 

table C 
    ---------------------------- 
    CODE | DESCRIPTION 
    ---------------------------- 
    AA | code 4 
    AB | code 5 
    AC | code 6 

表BとCには一意の行があります。

------------------------------------- 
    NAME | CODE | DESCRIPTION | DUPLICATE 
    ------------------------------------- 
    bob | PL | code 1  | YES 
    david | AA | code 4  | NO 
    susan | PL | code 1  | YES 
    joe | AB | code 5  | NO 
    Alfred | PL | code 1  | YES 

あなたは全くのテーブルBCを必要とする理由私がこれまで

http://sqlfiddle.com/#!9/ffb2eb/16

+0

あなたのSQLフィドルは、MySQL、Oracleのではないです。 –

答えて

3

を試してみました私は何を見ていない:行が重複したレコードを持っている私は、フラグに必要 結果フラグを計算します。あなたは、ウィンドウ関数でこれを行うことができます。

ここ
select a.*, coalesce(b.description, c.description) as description, 
     (case when count(*) over (partition by a.code) > 1 then 'YES' else 'NO' 
     end) as flag 
from a left join 
    b 
    on a.code = b.code left join 
    c 
    on a.code = c.code; 

は作業オラクルSQL Fiddle次のとおりです。

select a.*, 
     (case when count(*) over (partition by a.code) > 1 then 'YES' else 'NO' 
     end) as flag 
from a; 

は、あなたは追加の値に持って帰りたいと思う場合BCが必要です。

+0

私はそれがMYSQLで動作しないと思います http://sqlfiddle.com/#!9/44805b/1 – muhnizar

+1

@muhnizar - **あなたはゴードンではなく、元の質問に「Oracle」とタグ付けされています。 MySQLの。 (あるいはStackOverflowのWebサイトで自動的にタグ付けされていますが、あなたの質問を投稿する前に修正していない可能性もあります)常に投稿の下にあるタグに注意を払ってください。事実の後(**のように**現在)、あなたはあなたの投稿を '編集 'し、**あなたが使っているデータベースを反映する**タグを変更することができます。 – mathguy

+0

@ gordonlinoff - テーブルBとCが示されているようなもので、それらが互いに素であると仮定すると(そうでなければ、問題はそれほど意味をなさない)、BとCのUNION ALLより効率的です。結果は「大きな」テーブルになります。したがって、2つではなく1つの結合が存在します。 – mathguy

1

MYSQLで以下のコード(http://sqlfiddle.com/#!9/9a149b/1)を試してみてください

注: - コードは、同様のOracleで動作http://sqlfiddle.com/#!4/6c6df/5

select A.*, 
COALESCE(B.DESCRIPTION, C.DESCRIPTION) AS DESCRIPTION, 
dup.DUPLICATE 
from A 
left join B on A.CODE = B.CODE 
left join C on A.CODE = C.CODE 
INNER JOIN (select a.code, 
     case when count(a.code) > 1 then 'YES' else 'NO' end as 
     DUPLICATE 
     from A 
     group by a.code) dup 
     ON A.code=dup.code 
+0

あなたの答えをありがとうが、私はUNIONを使用すると、それを使用していないよりも "メモリ"が必要だと思う(私が間違っている場合は私を修正してください) – muhnizar

+0

MYSQLのためのカウント(コード)とユニオンを避ける構文を使用してクエリを調整することができます私は試してみる – psaraj12

+0

ユニオンを使わずに答えを更新し、重複を更新するために大文字小文字を使用する – psaraj12

関連する問題