2015-04-02 1 views
0

У меня есть 2 таблицы, а именно ITEMLIST таблицы и ItemChara таблицы, имеющие такую ​​структуру:СОЕДИНЕНИЕ 2 таблицы и значения переходят в третью таблицу

enter image description here

где Item_Num П. Чарой является внешним ключом Таблица списка элементов. Теперь я пытаюсь подключиться к этим таблицам. С таким, как это.

enter image description here

Как я могу соединить эти таблицы с этими значениями, чтобы сформировать что-то вроде этого

enter image description here

Я пытаюсь выяснить, что это самый простой способ для достижения этой цели. Я ограничиваю цвета в таблице Item 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

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

Этот код не проверяется, может быть иметь некоторый синтаксис ERRO которого и нужно, чтобы проверить и разобраться. Дайте мне знать, если у вас все еще проблемы с проблемой.

+0

Это не даст правильные результаты, как 'chara_num' не только 1 или 2. – jpw

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