2010-05-31 123 views
27

假設我有一個包含以下信息的表:合併兩行SQL

FK | Field1 | Field2 
===================== 
3 | ABC | *NULL* 
3 | *NULL* | DEF 

有沒有辦法,我可以在表中執行select得到以下

FK | Field1 | Field2 
===================== 
3 | ABC | DEF 

感謝

編輯:固定field2名稱的清晰度

回答

5

有幾種方法取決於某些數據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 
2

有可能是整潔的方法,但下面可能是一個辦法:

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) 
11

聚合功能可以幫助你在這裏。聚合函數忽略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 
2

我也有類似的問題。不同之處在於我需要更多的控制權來回應我所做的事情,所以我最終得出了一個簡單而清晰的查詢。這是基於你的例子的簡化版本。

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只返回一行或你會被忽略的數據

1

如果一個行在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