Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于从各种表中获取结果的SQL查询_Sql_Sql Server - Fatal编程技术网

用于从各种表中获取结果的SQL查询

用于从各种表中获取结果的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

我有一个名为Users的表,它存储一般用户信息(用户id、名字、姓氏、电子邮件id、电话号码、是否处于活动状态等)。用户Id是主键

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

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

谢谢!我什么都不知道!这很好用!格雷西亚斯:)