2016-11-15 7 views
0

これらの2つの表を結合したいと思いますが、各ID + MODELに排他的な色を付ける必要があります。 TO-BE上の例で排他的な行が非キー列と一致するOracle SQL結合

PART  MODEL  COLOR 
1  XXX  RED 
1  YYY  YELLOW 

Table 1     Table 2 
PART Model    PART COLOR 
--------------   ------------ 
1  XXX    1  RED 
1  YYY    1  BLUE 
2  ZZZ    1  YELLOW 

、1 + XXXは、REDを有しているので、REDは、他の行に結合されます。 これを行うにはクールなトリックがありますか?私はどこでも検索しましたが、結果をテーブルに保存する以外に解決策がありません。

ありがとうございました!

+2

1 XXXと1 YYYを両方とも赤色にしてみませんか?あなたは* injective *関数が必要ですか(異なるモデルは異なる色を持たなければなりません)?それができない場合はどうしますか?利用可能な色よりもモデルが多い場合はどうしますか?この問題自体は、詳細な説明がなくても100%意味をなすわけではありません。 – mathguy

答えて

2

私は、それぞれpartが1つのランダムmodel + colorの組み合わせを作成することを除いて、結合条件の背後にあるロジックを確認できません。

それぞれpartの一意のIDを誰もが好きな分析関数row_numberで導入して、それを結合で使用することで可能です。

partition by part order by partが「ランダムに」ソートされているため(つまり、データベースエンジンがあなたではなく注文を決定する)ことに注意してください。

with 
models(part, model) as (
    select 1, 'XXX' from dual union all 
    select 1, 'YYY' from dual union all 
    select 2, 'ZZZ' from dual 
), 
models2(part, rn, model) as (
    select 
    part 
    ,row_number() over (partition by part order by part) as rn 
    ,model 
    from models 
), 
colors(part, color) as (
    select 1, 'RED' from dual union all 
    select 1, 'BLUE' from dual union all 
    select 1, 'YELLOW' from dual 
), 
colors2(part, rn, color) as (
    select 
    part 
    ,row_number() over (partition by part order by part) as rn 
    ,color 
    from colors 
) 
select 
models2.part 
,models2.model 
,colors2.color 
from models2 
inner join colors2 on colors2.part = models2.part 
        and colors2.rn = models2.rn 
; 

結果

PART MODEL  COLOR 
---- ---------- ---------- 
    1 XXX  RED 
    1 YYY  YELLOW 
0

ここに誰もあなたのロジックをうまくすることができますおそらくこれは、これは最初の2を参照する3番目のテーブルに行を追加することにより、最良のモデル化されていることを示す。例えば

CREATE TABLE Table1 
    (
    PART INT NOT NULL, 
    MODEL CHAR(3) NOT NULL, 
    UNIQUE (MODEL, PART) 
); 

    CREATE TABLE Table2 
    (
    PART INT NOT NULL, 
    COLOR CHAR(10) NOT NULL, 
    UNIQUE (COLOR, PART) 
); 

    CREATE TABLE ToBe 
    (
    PART INT NOT NULL, 
    MODEL CHAR(3) NOT NULL, 
    COLOR CHAR(10) NOT NULL, 
    FOREIGN KEY (MODEL, PART) 
     REFERENCES Table1 (MODEL, PART), 
    FOREIGN KEY (COLOR, PART) 
     REFERENCES Table2 (COLOR, PART), 
    UNIQUE (COLOR, MODEL, PART) 
); 
関連する問題