2016-11-15 19 views
0

我想加入这两个表,但我想让每个ID + MODEL都有一个独有的颜色。Oracle SQL连接与非键列有排他行匹配

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 

在上述例子中,1 + XXX具有RED,所以RED将被接合到任何其他行。 有没有一个很酷的把戏呢?我到处搜索,但除了将结果存储到表格之外,我无法提出解决方案。

谢谢!

+2

为什么不让1个XXX和1个YYY都是RED?你需要一个* injective *函数(意味着不同的模型必须有不同的颜色)?如果这是不可能的 - 如果有更多的模型比可用的颜色怎么样?没有更多的细节,问题本身并没有100%的意义。 – mathguy

回答

2

我无法选择加入条件背后的逻辑,除了每个part创建一个随机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

这里没有人可以计算出你的逻辑:这或许表明,这是最好的通过增加行至第三个表引用前两个模型:例如这里是标准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) 
);