2012-01-05 79 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 

(也,我保证会有人把它放回表结构从字符串后)