选择两行分为两列

时间:2014-04-24 14:09:01

标签: sql oracle rows multiple-columns

我在Oracle中有这样的SQL查询:

SELECT p.item_id, c.title
FROM product p
JOIN category c ON (p.item_id = c.item_id)
WHERE p.status = 'active';

这给我这样的行:

p.item_id | c.title

现在,假设我有另一个带有标签的表,每行一个标签,但我知道每个产品只有两个。说清楚:

title                     | item_id

'Some tag'                | 1
'Another tag'             | 1
'Tag for another product' | 2

我需要这样的输出:

p.item_id | c.title | t.tag_1 | t.tag_2 

所以在这种情况下:

'Some product' | 'My category' | 'Some tag' | 'Another product'

当我加入tag表时,我不知道怎么说我希望第一个结果成为一列而第二个成为另一列。谢谢你的建议。

2 个答案:

答案 0 :(得分:0)

因为您有两个,所以您可以使用min()max()轻松完成此操作:

SELECT p.item_id, c.title, min(t.title) as tag1, max(t.title) as tag2
FROM product p JOIN
     category c
     ON p.item_id = c.item_id JOIN
     tags t
     ON p.item_id = t.item_id
WHERE p.status = 'active'
GROUP BY p.item_id, c.title;

答案 1 :(得分:0)

Gordon Linoff为您提供了一个很好的解决方案。 但是,如果你有超过2个,你将需要更大的东西:

 select item, max(title1), ..., max(titleN) from (
 select item_id, 
 decode(nom, 1, title, null) title1,
 ....
 decode(nom, N, title, null) titleN
 from (
 select item_id, title, row_number() over (partition by item_id order by title) nom
 from category)
 )

然后将其加入产品以获得所需的输出。

如果您不仅需要在oracle中运行它,请使用CASE替换decode。