用于从各种表中获取结果的SQL查询
我有一个名为Users的表,它存储一般用户信息(用户id、名字、姓氏、电子邮件id、电话号码、是否处于活动状态等)。用户Id是主键 我有第二个表,存储用户的公寓单元号(一对多关系)。一个用户可以拥有一个或多个公寓。用户Id是辅助密钥用于从各种表中获取结果的SQL查询,sql,sql-server,Sql,Sql Server,我有一个名为Users的表,它存储一般用户信息(用户id、名字、姓氏、电子邮件id、电话号码、是否处于活动状态等)。用户Id是主键 我有第二个表,存储用户的公寓单元号(一对多关系)。一个用户可以拥有一个或多个公寓。用户Id是辅助密钥 UserID UnitNumber 1 2A 1 2B 2 8H UserID ParkingSpot 1 104 1 105 1 208 2 205 2 20
UserID UnitNumber
1 2A
1 2B
2 8H
UserID ParkingSpot
1 104
1 105
1 208
2 205
2 206
我有第三个表存储用户的停车位号(一对多关系)。
一个用户可以拥有零个或多个停车位。用户Id是辅助密钥
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 john@xyz.com 123-456-7890 2A, 2B 104, 105, 208
2 Mike Allen mike@xyz.com 456-789-0123 8H 205, 206
谢谢 您可以使用主键从多个表中选择:
SELECT Users.UserID, FirstName, LastName, Email, Phone, Units, ParkingSpots
FROM Users, Condos, ParkingUnit
WHERE Users.UserID == Condos.UserId
and Users.UserID == ParkingUnit.UserID
你可以这样做,但从长远来看,你会为此付出代价。在应用程序中这样做可能会更快
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
(另外,我保证稍后会有人将其从字符串放回表结构)您可以使用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
谢谢!我什么都不知道!这很好用!格雷西亚斯:)