我有如下数据,我想将具有空值的行与非空值的行合并。
ID ColA ColB ColC ColD
1 A1 B1 null null
1 A2 B2 null null
1 null B3 C1 D1
2 A3 B3 null null
3 null null C3 D3
预期结果:
ID ColA ColB ColC ColD
1 A1 B1 C1 D1
1 A2 B2 C1 D1
2 A3 B3 null null
3 null null C3 D3
对于单个ID,基本上可以存在多行(不同的COLA),但只有一行ColA为空。
对于ColA不为空的行,ColC和ColD始终为空。
我想将ColA为空的行的ColB,ColC和ColD值与不为ColA的所有行合并。
答案 0 :(得分:1)
一种方法是使用两个相关的子查询:
SELECT ID,ColA,ColB,
(SELECT ColC FROM table y
WHERE x.id = y.id AND ColA IS NULL) As ColC,
(SELECT ColD FROM table y
WHERE x.id = y.id AND ColA IS NULL) As ColD
FROM table x
WHERE ColA IS NOT NULL
另一种方法是使用自我联接
SELECT x.ID,x.ColA,x.ColB,
y.ColC,y.ColD
FROM table x
JOIN table y
ON x.ID = y.ID AND x.ColA IS NOT NULL AND y.ColA IS NULL
编辑
如果对于特定ID,只有一行的ColA值不为空
我猜你的意思是对于特定的ID根本没有ColA = NULL的行。
在这种情况下,第一个查询将起作用,第二个查询必须使用LEFT JOIN:
SELECT x.ID,x.ColA,x.ColB,
y.ColC,y.ColD
FROM table x
LEFT JOIN table y
ON x.ID = y.ID AND x.ColA IS NOT NULL AND y.ColA IS NULL
或只有空ColA的行
在这种情况下,必须使用NOT EXISTS子查询来扩展条件:
SELECT ID,ColA,ColB,
(SELECT ColC FROM table y
WHERE x.id = y.id AND ColA IS NULL) As ColC,
(SELECT ColD FROM table y
WHERE x.id = y.id AND ColA IS NULL) As ColD
FROM table x
WHERE ColA IS NOT NULL
OR NOT EXISTS (
SELECT 1 FROM table z
WHERE x.id = z.id AND z.ColA IS NOT NULL
)
SELECT x.ID,x.ColA,x.ColB,
y.ColC,y.ColD
FROM table x
LEFT JOIN table y
ON x.ID = y.ID AND y.ColA IS NULL
WHERE x.ColA IS NOT NULL
OR NOT EXISTS (
SELECT 1 FROM table z
WHERE x.id = z.id AND z.ColA IS NOT NULL
)
答案 1 :(得分:0)
您可以尝试以下方法:
SELECT filled.ID,
filled.ColA,
filled.ColB AS ColB_1,
empty.ColB AS ColB_2,
empty.ColC,
empty.ColD
FROM my_table filled
JOIN my_table empty
ON filled.ID = empty.ID
AND empty.ColA IS NULL
WHERE filled.ColA IS NOT NULL;
如果带有LEFT OUTER JOIN
的行可能不存在,请使用ColA IS NULL
。