2015-04-02 25 views
0

我有2个表即ITEMLIST表和ItemChara表,具有这种结构的:JOINING 2个表和通值成第三表

enter image description here

其中,项目甜心Item_Num是一个外键项目列表表。现在我试图加入这些表格。有了这样的给定。

enter image description here

我如何加入这些表使用这些值来形成这样的事情

enter image description here

我试图找出什么是实现这一目标的最简单方法。我将表项Chara中的颜色限制为每个项目最多2种颜色,因此每项不会超过2种颜色。我想制作另一列像Color1和Color2,以获取每个项目中的每种颜色。如果发生该项目没有配对的颜色,它可能会留空,也可能为空。

对不起,但我不知道该怎么称呼我想做的事情,但我知道我想要的输出,所以问题标题可能无关紧要。我一发现就会改变它。

回答

1

一种方法是使用row_number()窗函数:

select 
    i.item_num, i.item_name, 
    max(case when rn = 1 then ic.chara_color end) color1, 
    max(case when rn = 2 then ic.chara_color end) color2 
from itemlist i 
join (
    select 
     item_num, chara_color, 
     rn = row_number() over (partition by item_num order by chara_num) 
    from itemchara 
) ic on i.item_num = ic.item_num 
group by i.item_num, item_name; 
+0

这似乎是对我的工作的最简单和简洁的代码这不会给出正确的结果。我会将其标记为答案。也试过这个,给了我想要的输出。 – Chloe 2015-04-04 03:59:20

0

下面的代码会给你所需的结果。

select A.item_num,A.Item_name, 
 
\t max(Color_1) AS Color_1, 
 
\t max(Color_2) As Color_2 
 
from (
 
\t select il.item_num,il.Item_name, 
 
\t \t (case when ic.chara_num = 1 then ic.chara_color END) AS Color_1, 
 
\t \t (case when ic.chara_num = 2 then ic.chara_color END) AS Color_2 
 
\t from Item_List il inner join Item_Chara ic on il.Item_Num = ic.Item_Num 
 
) A 
 
group by item_num,Item_name

这段代码没有进行测试,可以有一些语法埃罗其中U需要检查并整理出来。让我知道如果你仍然面临一些问题。要做到这一点

+0

作为'chara_num'不只是1或2 – jpw 2015-04-02 11:26:31

0

到其他的答案相似,但因为我已经做它,我可能无论如何张贴。

;with itemlist(itemId, itemName) 
as 
(
select 1,'Bag' 
union ALL 
select 2,'Pen' 
union ALL 
select 3,'Bike' 
union ALL 
select 4,'Shoes' 
) 
,itemchara(charaId, itemId, charaColor) 
as 
(
select 1, 1, 'Blue' 
union all 
select 2, 1, 'Red' 
union all 
select 3, 2, 'Black' 
union all 
select 4, 2, 'Blue' 
union all 
select 5, 3, 'Green' 
union all 
select 6, 4, 'Black' 
) 
,tmp 
as 
(
select i.itemName 
     ,c.* 
     ,row_number() over (partition by c.itemId order by c.charaId) as r 
from itemlist i 
join itemchara c 
    on i.itemId = c.itemId 
) 

select t1. itemId 
     ,t1.itemName 
     ,t1.charaColor 
     ,t2.charaColor 
from tmp t1 
left join tmp t2 
    on t1.r+1 = t2.r 
    and t1.itemId = t2.itemId 
where t1.r = 1 
相关问题