在oracle sql中将多行合并为1

时间:2014-07-28 19:06:14

标签: sql oracle

我的搜索功能让我失望,但我认为我在MERGE声明中走在正确的轨道上。

我有一个看起来像这样的表:

P_K,Col_1,Col2,Col3
1,word,null,null
1,null,number,null
1,null,null,3

我希望我的陈述结果如下:

P_K,Col_1,Col_2,Col_3
1,word,number,3

谢谢!

2 个答案:

答案 0 :(得分:1)

你缺少一些细节来真正给你一个很好的答案,但这是用你提供的一小部分数据来做到这一点的一种方法。

select x.P_K
      ,(select a.col_1 from t a where a.p_k = x.p_k and a.col_1 not NULL) as col_1
      ,(select b.col_2 from t b where b.p_k = x.p_k and b.col_2 not NULL) as col_2
      ,(select c.col_3 from t c where c.p_k = x.p_k and c.col_3 not NULL) as col_3
  from t x
 group by x.P_K

另一种方式可能是这样的:

select x.P_K
      ,MAX(x.col_1) as col_1
      ,MAX(x.col_2) as col_2
      ,MAX(x.col_3) as col_3
  from t x
 group by x.P_K

您使用的那个将取决于数据中的边缘情况。

如果要为每个col_N容忍多行,则使用MAX。如果你希望每个col_N有多行时select会失败,那么使用subselect技术。

失败的意思是数据库引擎会报告一个错误,该错误说明在只允许一行的上下文中返回了多行。根据您的工作情况,您可能想知道不符合模式的数据。

MAX()技术运行得更快。

答案 1 :(得分:1)

如果您只想要一个返回一行数据的查询,则应该使用简单聚合

SELECT t.p_k,
       max( t.col_1 ) col_1,
       max( t.col_2 ) col_2,
       max( t.col_3 ) col_3
  FROM table_name t
 GROUP BY t.p_k