2011-07-13 73 views
4

我想帶兩個記錄是這樣的:通過創建新字段合併SQL結果?

Id Fname Lname Email 
------------------------------------ 
1 John Doe [email protected] 
2 John Doe [email protected] 

並以這樣的方式,我只有一個記錄將它們組合起來:

Id Fname Lname Email1   Email2 
--------------------------------------------------- 
1 John Doe [email protected] [email protected] 

正如你所看到的,這將增加字段添加到我的記錄中,否則該數據庫不存在於數據庫中。這是可能的還是我必須找到另一種方式?

注意:我無法以任何方式更改數據庫結構。

+3

你正在使用哪個數據庫?版本是什麼? – Chandu

+0

你需要有兩個電子郵件字段,或者是一個分隔字段嗎? – Chains

+0

你知不知道只有兩個電子郵件地址需要這樣做,或者有時候可能是3或4或更多...? – Chains

回答

2

數據庫產品和版本在這裏有所不同。假設你如果不使用支持排序函數(如MySQL的)產品使用的東西,支持排序函數(例如SQL服務器2005+)

Select FName, LName 
    , Min(Case When Rnk = 1 Then Z.Email End) As Email1 
    , Min(Case When Rnk = 2 Then Z.Email End) As Email2 
From (
     Select FName, LName, Email 
      , Row_Number() Over (Partition By FName, LName Order By Id) As Rnk 
     From MyTable 
     ) As Z 
Group By Z.FName, Z.LName 

,那麼它是棘手。應工作在幾乎所有的數據庫系統的一個解決辦法是:

Select FName, LName 
    , Min(Case When Rnk = 1 Then Z.Email End) As Email1 
    , Min(Case When Rnk = 2 Then Z.Email End) As Email2 
From (
     Select FName, LName, Email 
      , (Select Count(*) 
       From MyTable As T2 
       Where T1.FName = T2.FName 
        And T2.LName = T2.LName 
        And T2.Id < T1.Id) + 1 As Rnk 
     From MyTable As T1 
     ) As Z 
Group By Z.FName, Z.LName 
0

如果您使用的SQL Server,請參閱這篇文章:http://support.microsoft.com/kb/175574

它有不同的數據的例子,但任務是一樣的。通常,您可以通過搜索「旋轉表[rdbmstype]」在谷歌或Bing

0
select x.Id as ID, x.Fname as Fname, x.Lname as Lname, x.Email as Email1, y.Email as email2 from 
     (select id, fname, lname, email from table) as x inner join 
     (select id, email from table) as y on x.id = y.id and x.email != y.email 

可能有點低效率的,但它會完成這項工作找到其他RDBMS的例子。

0

在MySQL中,你可以使用GROUP_CONCAT()

SELECT Fname, Lname, GROUP_CONCAT(email) emails 
FROM tbl 
GROUP BY Fname, Lname; 

如果您需要在不同的領域電子郵件,您可以拆分導致emails串您編程環境(如在PHP explode(',', $result['emails'])),或使用自連接(僅適用於2電子郵件字段):

SELECT a.Fname, a.Lname, a.Email Email1, b.email Email2 
FROM tbl a JOIN tbl b ON a.Fname = b.Fname AND a.Lname = b.Lname AND a.Email != b.Email 

加入對照選項:

GROUP BY CONCAT(GREATEST(Email1,Email2),LEAST(Email1,Email2)) 

擺脫重複的電子郵件對。