T-Sql

如何從一行中的多行列印查詢?

  • April 16, 2019

在 SQL Server 2017 中,我有一個多對多表:

=========================
id     nameID     phoneID
=========================
1        1           1
2        2           2
3        1           3

假設 nameID 1 是 NameTable 中 John 的 FK。phoneID 1 是 PhoneTable 中 01 234 567 的 FK,phoneID 3 是 02 345 678 的 FK。

當我join表格時,我得到兩行。

======================
name        phone
======================
John       01 234 567
John       02 345 678

但是,我需要一行中的字元串。如何在一行中列印姓名和電話,如下所示:

John, 01 234 567, 02 345 678

編輯 1:我在這裡找到了 Oracle 的類似問題和解決方案LISTAGG。Edit2:是 T-SQL 的解決方案FOR XML PATH

這取決於您的 SQL Server 版本。在 SQL Server 2016 或更高版本中,您可以使用 STRING_AGG:

DECLARE @Names TABLE (ID INT IDENTITY, FirstName VARCHAR(25))
DECLARE @Phones TABLE (ID INT IDENTITY, Phone VARCHAR(25))
DECLARE @ManyToMany TABLE (ID INT IDENTITY, NameID INT, PhoneID INT)

INSERT INTO @Names 
VALUES ('John'), ('Mike')

INSERT INTO @Phones 
VALUES ('12 345 678'), ('00 987 654'), ('11 254 009')

INSERT INTO @ManyToMany (NameID, PhoneID)
VALUES (1, 1), -- John link #1
   (1, 3), --John link #2
   (2, 2) -- Mike link #1

SELECT n.FirstName AS [Name],
   STRING_AGG(p.[Phone], ',') AS [Phone]
FROM @ManyToMany m
INNER JOIN @Names n ON n.ID = m.NameID
LEFT JOIN @Phones p ON p.ID = m.PhoneID
GROUP BY n.FirstName

結果:

Name    Phone
-----------------------------
John    12 345 678,11 254 009
Mike    00 987 654

引用自:https://dba.stackexchange.com/questions/234853