加入2个表并将值传递到第三个表中

时间:2015-04-02 10:20:28

标签: sql-server-2008 tsql join

我有2个表,即ItemList表和ItemChara表,具有这种结构:

enter image description here

其中,Item Chara的Item_Num是Item List表的外键。现在我试图加入这些表格。有这样的给定。

enter image description here

如何使用这些值加入这些表以形成类似的东西

enter image description here

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

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

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

下面的代码将为您提供所需的结果。

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

此代码未经测试可能有一些语法错误,您需要检查并排序。如果我还面临一些问题,请告诉我。

答案 2 :(得分: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