2012-01-05 82 views
0

我有一個名爲用戶的表,用於存儲通用用戶信息(用戶標識,名,姓,電子郵件ID,電話號碼,活動等)。用戶標識是主鍵。從各種表中獲取結果的SQL查詢

我有第二個表存儲用戶的公寓單元號碼(一對多關係)。一個用戶可以有一個或多個公寓。用戶標識是輔助鍵。

UserID UnitNumber 
    1  2A 
    1  2B 
    2  8H 

我有第三個表存儲用戶的停車位號碼(一對多關係)。 一個用戶可以有零個或多個停車位。用戶標識是輔助鍵。

UserID ParkingSpot 
1  104 
1  105 
1  208 
2  205 
2  206 

如何編寫一個查詢,該查詢將返回用戶信息以及每個用戶的公寓單元號碼和停車位號碼?

我所希望得到的是這樣的:

UserID FirstName LastName Email   Phone   Units ParkingSpots 
1  John  Smith  [email protected] 123-456-7890 2A, 2B 104, 105, 208 
2  Mike  Allen  [email protected] 456-789-H  205, 206 

謝謝!

+0

http://stackoverflow.com/問題/ 3197626/concatenate-multiple-rows – Fionnuala 2012-01-05 21:00:27

+0

謝謝先生! :) – user1100221 2012-01-05 21:03:26

回答

0

可以使用STUFF函數

SELECT 
    UserID, 
    FirstName, 
    LastName, 
    Email, 
    Phone, 
    STUFF((SELECT ',' + n.UnitNumber FROM dbo.Units n WHERE n.UserID = u.UserID FOR XML PATH('')), 1, 1, ''), 
    STUFF((SELECT ',' + p.ParkingSpot FROM dbo.Parking p WHERE p.UserID = u.UserID FOR XML  PATH('')), 1, 1, '') 
FROM Users u 
+0

非常感謝!我不知道屎!這完美的作品!格拉西亞斯。 :) – user1100221 2012-01-05 21:26:16

0

您可以從多個表使用主鍵選擇:

SELECT Users.UserID, FirstName, LastName, Email, Phone, Units, ParkingSpots 
FROM Users, Condos, ParkingUnit 
WHERE Users.UserID == Condos.UserId 
and Users.UserID == ParkingUnit.UserID 
0

你可以這樣做,但你會在長期內爲它付出。它在應用程序中可能會更快。

create table #user (UserID int, FName varchar(max)) 
insert into #user values (1,'Jeremy') 
insert into #user values (2,'Gisele') 


create table #property (UserID int, UnitNumber varchar(2)) 
insert into #property values (1,'2A') 
insert into #property values (1,'2B') 
insert into #property values (2,'3A') 
insert into #property values (2,'3B') 

create table #parkingspot (UserID int, ParkingSpot int) 
insert into #parkingspot values (1,104) 
insert into #parkingspot values (1,105) 
insert into #parkingspot values (2,106) 

;with Info as 
(
select * 
,Units = (select UnitNumber + ',' from #property where UserID = u.UserID for xml  path('')) 
,ParkingSpots = (select cast(ParkingSpot as varchar(max)) + ',' from #parkingspot where  UserID = u.UserID for xml path('')) 
from #user u 
) 
select *,StripUnitComma = case when LEN(Units) > 0 then Left(Units,LEN(Units)-1) else  Units end 
from Info 

(也,我保證會有人把它放回表結構從字符串後)