我有2个表,即ItemList表和ItemChara表,具有这种结构:
其中,Item Chara的Item_Num是Item List表的外键。现在我试图加入这些表格。有这样的给定。
如何使用这些值加入这些表以形成类似的东西
我试图找出实现这一目标的最简单方法。我将表物品Chara中的颜色限制为每件物品最多2种颜色,因此每件物品不会超过2种颜色。我想制作另一个像Color1和Color2的列来获取每个项目中的每种颜色。如果项目没有配对的颜色,它就会留空,或者可能为空。
很抱歉,但我不知道该怎么称呼我要做的事情,但我知道我想要的输出,所以问题标题可能无关紧要。我一发现就会改变它。
答案 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