2016-11-15 2 views
0

Ich möchte diese beiden Tabellen verbinden, aber ich möchte, dass jedes ID + MODEL eine exklusive Farbe hat.Oracle SQL Join mit exklusiven Zeilenabgleich mit Nicht-Schlüsselspalten

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

TO-BE

PART  MODEL  COLOR 
1  XXX  RED 
1  YYY  YELLOW 

In dem obigen Beispiel 1 + XXX RED hat, so wird RED irgendeine andere Reihe verbunden werden. Gibt es einen coolen Trick, dies zu tun? Ich habe überall gesucht, aber ich kann keine Lösung finden und Ergebnisse nicht in einer Tabelle speichern.

Vielen Dank!

+2

Warum macht 1 XXX und YYY 1 nicht beide sein RED? Brauchen Sie eine * injective * -Funktion (was bedeutet, dass verschiedene Modelle unterschiedliche Farben haben müssen)? Was ist, wenn das nicht möglich ist - was ist, wenn es mehr Modelle als verfügbare Farben gibt? Das Problem selbst macht nicht 100% Sinn ohne weitere Details. – mathguy

Antwort

2

Ich kann nicht die Logik hinter der Join-Bedingung sehen, außer dass für jede part eine zufällige model + color Kombination erstellen.

Wir können das tun, indem wir eine eindeutige ID für jede part mit jedermanns Lieblingsanalyse-Funktion row_number einführen und dann diese in der Verbindung verwenden.

Beachten Sie, dass, weil partition by part order by part die Teile "zufällig" sortiert sind (d. H. Die Datenbank-Engine entscheidet über die Reihenfolge nicht Sie).

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 
; 

Ergebnisse

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

Niemand hier kann Ihre Logik funktionieren: Vielleicht zeigt dies an, dies am besten durch Hinzufügen von Zeilen zu einer dritten Tabelle, die die ersten beiden verweist modelliert wird: z.B. hier ist eine Skizze in Standard-SQL:

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