假设我有一个包含以下信息的表:合并两行SQL
FK | Field1 | Field2
=====================
3 | ABC | *NULL*
3 | *NULL* | DEF
有没有办法,我可以在表中执行select得到以下
FK | Field1 | Field2
=====================
3 | ABC | DEF
感谢
编辑:固定field2名称的清晰度
假设我有一个包含以下信息的表:合并两行SQL
FK | Field1 | Field2
=====================
3 | ABC | *NULL*
3 | *NULL* | DEF
有没有办法,我可以在表中执行select得到以下
FK | Field1 | Field2
=====================
3 | ABC | DEF
感谢
编辑:固定field2名称的清晰度
有几种方法取决于某些数据r你还没有包括的东西,但这里有一个方法是使用你的东西。
SELECT
t1.Field1,
t2.Field2
FROM Table1 t1
LEFT JOIN Table1 t2 ON t1.FK = t2.FK AND t2.Field1 IS NULL
另一种方式:
SELECT
t1.Field1,
(SELECT Field2 FROM Table2 t2 WHERE t2.FK = t1.FK AND Field1 IS NULL) AS Field2
FROM Table1 t1
有可能是整洁的方法,但下面可能是一个办法:
SELECT t.fk,
(
SELECT t1.Field1
FROM `table` t1
WHERE t1.fk = t.fk AND t1.Field1 IS NOT NULL
LIMIT 1
) Field1,
(
SELECT t2.Field2
FROM `table` t2
WHERE t2.fk = t.fk AND t2.Field2 IS NOT NULL
LIMIT 1
) Field2
FROM `table` t
WHERE t.fk = 3
GROUP BY t.fk;
测试用例:
CREATE TABLE `table` (fk int, Field1 varchar(10), Field2 varchar(10));
INSERT INTO `table` VALUES (3, 'ABC', NULL);
INSERT INTO `table` VALUES (3, NULL, 'DEF');
INSERT INTO `table` VALUES (4, 'GHI', NULL);
INSERT INTO `table` VALUES (4, NULL, 'JKL');
INSERT INTO `table` VALUES (5, NULL, 'MNO');
结果:
+------+--------+--------+
| fk | Field1 | Field2 |
+------+--------+--------+
| 3 | ABC | DEF |
+------+--------+--------+
1 row in set (0.01 sec)
没有WHERE t.fk = 3
条款运行相同的查询,它会返回以下结果集:
+------+--------+--------+
| fk | Field1 | Field2 |
+------+--------+--------+
| 3 | ABC | DEF |
| 4 | GHI | JKL |
| 5 | NULL | MNO |
+------+--------+--------+
3 rows in set (0.01 sec)
聚合功能可以帮助你在这里。聚合函数忽略NULLs
(至少这是真正的SQL服务器,Oracle和Jet /访问),因此你可以使用这样的查询(有关SQL Server Express 2008 R2测试):
SELECT
FK,
MAX(Field1) AS Field1,
MAX(Field2) AS Field2
FROM
table1
GROUP BY
FK;
我用MAX
,但是从GROUP BY
行中挑选一个值的任何聚合都应该有效。
测试数据:
CREATE TABLE table1 (FK int, Field1 varchar(10), Field2 varchar(10));
INSERT INTO table1 VALUES (3, 'ABC', NULL);
INSERT INTO table1 VALUES (3, NULL, 'DEF');
INSERT INTO table1 VALUES (4, 'GHI', NULL);
INSERT INTO table1 VALUES (4, 'JKL', 'MNO');
INSERT INTO table1 VALUES (4, NULL, 'PQR');
结果:
FK Field1 Field2
-- ------ ------
3 ABC DEF
4 JKL PQR
我也有类似的问题。不同之处在于我需要更多的控制权来回应我所做的事情,所以我最终得出了一个简单而清晰的查询。这是基于你的例子的简化版本。
select main.id, Field1_Q.Field1, Field2_Q.Field2
from
(
select distinct id
from Table1
)as main
left outer join (
select id, max(Field1)
from Table1
where Field1 is not null
group by id
) as Field1_Q on main.id = Field1_Q.id
left outer join (
select id, max(Field2)
from Table1
where Field2 is not null
group by id
) as Field2_Q on main.id = Field2_Q.id
;
这里的诀窍是第一个选择'main'选择要显示的行。然后你每场有一个选择。正在加入的内容应该是“主”查询返回的所有相同值。
被警告,那些其他的查询需要每个ID只返回一行或你会被忽略的数据
如果一个行在field1的列值和其他行具有空值,则该查询可能会奏效。
SELECT
FK,
MAX(Field1) as Field1,
MAX(Field2) as Field2
FROM
(
select FK,ISNULL(Field1,'') as Field1,ISNULL(Field2,'') as Field2 from table1
)
tbl
GROUP BY FK