2010-01-13 103 views
1

我正在嘗試創建一個包含引用地址的所有城市的列。SQL遞歸合併

DECLARE @AddressList nvarchar(max) 
SELECT @AddressList = COALESCE(@AddressList + ' ', '') + City FROM [Address] 

SELECT 
    Employee.*, 
    (SELECT @AddressList) AS AddressCities 
FROM Employee 

但我不知道在哪裏把WHERE子句。

... 
    (SELECT @AddressList WHERE EmployeeId = Employee.EmployeeId) AS AddressCities 
... 

以上測試不工作..

表架構是:

員工
僱員
名稱

地址


僱員

+0

你能否提供更多的表模式的? – 2010-01-13 13:19:38

回答

1

如果我理解正確,您希望在員工的單個列中顯示所有城市。所以你希望GROUP BY和CONCAT

使用SQL Server 2005,試試這個(工作示例)

DECLARE @Employee TABLE(
     EmployeeId INT, 
     NAME VARCHAR(100) 
) 

INSERT INTO @Employee (EmployeeId,[NAME]) SELECT 1, 'A' 
INSERT INTO @Employee (EmployeeId,[NAME]) SELECT 2, 'B' 

DECLARE @Address TABLE(
     Street VARCHAR(50), 
     City VARCHAR(50), 
     EmployeeId INT 
) 

INSERT INTO @Address (Street,City, EmployeeId) SELECT 'A','A', 1 
INSERT INTO @Address (Street,City, EmployeeId) SELECT 'B','B', 1 
INSERT INTO @Address (Street,City, EmployeeId) SELECT 'C','C', 1 
INSERT INTO @Address (Street,City, EmployeeId) SELECT 'D','D', 2 
INSERT INTO @Address (Street,City, EmployeeId) SELECT 'E','E', 2 
INSERT INTO @Address (Street,City, EmployeeId) SELECT 'F','F', 2 


SELECT e.EmployeeId, 
     e.[NAME], 
     (
      SELECT al.City + ',' 
      FROM @Address al 
      WHERE al.EmployeeId = e.EmployeeId 
      FOR XML PATH('') 
     ) 
FROM @Employee e 
GROUP BY e.EmployeeId, 
     e.[NAME] 
+0

+1 XML PATH是最簡單的方法來做到這一點,如果你想,如果你不承認爲什麼它可以使用'原樣' – 2010-01-13 13:36:26

0

難道需要你的意思是「包含所有城市列」什麼的更多信息。怎麼又是你想要什麼,下面的不同可能會幫助你那句問題

SELECT e.EmployeeId,e.Name,a.City 
FROM Employee e 
INNER JOIN Address a ON a.EmployeeId = e.EmployeeId 
GROUP BY e.EmployeeId,e.Name 

- 更新

我想我明白你的意思,你要喜歡:

EmployeeID | Name | Address 
1   | John | 'London','Paris','Rome' 
2   | Jane | 'New York','Miami' 

+0

是的,這就是我所需要的;) – Chris 2010-01-13 13:37:49