SQL:将列拆分为多个

时间:2014-04-01 07:40:49

标签: sql join h2

我有下表:

CREATE TABLE yow(
  userid INT,
  itemid INT,
  feedback INT,
  value INT)

(userid,itemid,feedback)可以被视为主键,其中每个元组都包含一个值。

我想要一个返回包含以下列的表的查询: userid | itemid | col0 | col1 | COL2

其中col0包含value yow中反馈= 0的所有行,而col1包含value,其中反馈= 1,依此类推。

我有一个有点工作的问题:

SELECT
yow.userid AS uid, 
yow.itemid AS iid,
isNull(col0.value, 0) AS col0,
IsNull(col1.value, 0) AS col1,
IsNull(col2.value, 0) AS col2
FROM yow 

LEFT JOIN yow AS col0 ON col0.userid=yow.userid AND col0.itemid=yow.itemid
LEFT JOIN yow AS col1 ON col1.userid=yow.userid AND col1.itemid=yow.itemid
LEFT JOIN yow AS col2 ON col2.userid=yow.userid AND col2.itemid=yow.itemid

WHERE col0.feedback = 0 
AND col1.feedback = 1
AND col2.feedback = 2
GROUP BY uid, iid

问题是我可以在col1或col2中使用(userid,itemid)值,但不能在其他值中使用。使用此查询,将过滤掉这些行,而不是将缺少的单元格默认为0。

作为一个例子,我得到这样的东西:

+-------+-------+--------+--------+--------+
| UID   | IID   | COL0   | COL1   | COL2   |
+-------+-------+--------+--------+--------+
|     1 |   101 |     23 |     22 |    241 |
|     1 |   101 |     51 |     13 |    159 |
|     2 |   102 |     22 |     55 |    152 |
|     3 |   103 |     14 |     41 |    231 |
+-------+-------+--------+--------+--------+

但我想要这样的东西,其中col0的缺失值默认为0。

+-------+-------+--------+--------+--------+
| UID   | IID   | COL0   | COL1   | COL2   |
+-------+-------+--------+--------+--------+
|     1 |   101 |     23 |     22 |    241 |
|     1 |   101 |     51 |     13 |    159 |
|     1 |   102 |      0 |     15 |    142 |
|     2 |   102 |     22 |     55 |    152 |
|     2 |   103 |      0 |     45 |     92 |
|     3 |   103 |     14 |     41 |    231 |
+-------+-------+--------+--------+--------+

有人可以建议修复我的查询或者提出更好的查询吗?我在H2上运行它,所以我认为查询应该有点标准。感谢:)

1 个答案:

答案 0 :(得分:1)

where条件将过滤掉所有null(缺失)条目。为避免这种情况,您需要将feedback = x移动到连接条件。请尝试以下方法:

SELECT
yow.userid AS uid, 
yow.itemid AS iid,
isNull(col0.value, 0) AS col0,
IsNull(col1.value, 0) AS col1,
IsNull(col2.value, 0) AS col2
FROM yow 
LEFT JOIN yow AS col0 ON col0.feedback = 0 
AND col0.userid=yow.userid AND col0.itemid=yow.itemid
LEFT JOIN yow AS col1 ON col1.feedback = 1 
AND col1.userid=yow.userid AND col1.itemid=yow.itemid
LEFT JOIN yow AS col2 ON col2.feedback = 2 
AND col2.userid=yow.userid AND col2.itemid=yow.itemid
GROUP BY uid, iid