假設我有一個包含以下信息的表:合併兩行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