我有一个名为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
谢谢!
答案 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