SQL Query从各种表中获取结果

时间:2012-01-05 20:52:57

标签: sql sql-server

我有一个名为Users的表,用于存储通用用户信息(用户ID,名字,姓氏,电子邮件ID,电话号码,活动等)。用户ID是主键。

我有第二个表存储用户的公寓单元号(一对多关系)。一个用户可以拥有一个或多个公寓。用户ID是次要密钥。

UserID UnitNumber
    1      2A
    1      2B
    2      8H

我有第三张表存储用户的停车位数(一对多关系)。 一个用户可以拥有零个或多个停车位。用户ID是次要密钥。

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

如何编写一个查询,返回用户信息以及每个用户的公寓单位号和停车位号?

我希望获得的是这样的:

UserID  FirstName  LastName  Email         Phone         Units    ParkingSpots
1       John       Smith     john@xyz.com  123-456-7890  2A, 2B   104, 105, 208
2       Mike       Allen     mike@xyz.com  456-789-0123  8H       205, 206

谢谢!

3 个答案:

答案 0 :(得分:0)

您可以使用主键从多个表中进行选择:

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

答案 1 :(得分: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

(另外,我保证有人会稍后将其放回到字符串的表结构中)

答案 2 :(得分: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