我的搜索功能让我失望,但我认为我在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
谢谢!
答案 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