我想拍两张这样的唱片:
Id Fname Lname Email
------------------------------------
1 John Doe jdoe@example.com
2 John Doe doej1@place.net
并将它们组合在一起,我只有一条记录:
Id Fname Lname Email1 Email2
---------------------------------------------------
1 John Doe jdoe@example.com doej@place.net
正如您所看到的,这会在我的记录中添加一个字段,否则数据库中就不存在该字段。这是可能的,还是我必须找到另一种方式?
注意:我无法以任何方式更改数据库结构。
答案 0 :(得分:2)
数据库产品和版本在这里完全不同。假设您正在使用支持排名功能的东西(例如SQL Server 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
如果您没有使用支持排名功能的产品(例如MySQL),那么它就更棘手了。一个应该适用于几乎所有数据库系统的解决方案是:
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
答案 1 :(得分:0)
如果您使用的是SQL Server,请参阅此文章:http://support.microsoft.com/kb/175574
它有一个不同数据的例子,但任务是一样的。您通常可以通过在Google或Bing上搜索“旋转表[rdbmstype]”来查找其他RDBMS的示例
答案 2 :(得分: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
可能效率不高,但它可以完成工作。
答案 3 :(得分: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))
摆脱重复的电子邮件对。