SQL自连接查询
我有四张桌子:SQL自连接查询,sql,Sql,我有四张桌子: Service (serviceId(PK), serviceTypeId, capacity) Facilitator (facilitatorId(PK), facilitatorName) ServiceType (serviceTypeId(PK), serviceType) ServiceFacilitator (serviceId(PK), facilitatorId(PK)) (join entity) 目前“服务类型”表中的服务类型为酒店和会议中心 “服务”表中
Service (serviceId(PK), serviceTypeId, capacity)
Facilitator (facilitatorId(PK), facilitatorName)
ServiceType (serviceTypeId(PK), serviceType)
ServiceFacilitator (serviceId(PK), facilitatorId(PK)) (join entity)
目前“服务类型”表中的服务类型为酒店和会议中心
“服务”表中的“容量”列包含的数字仅在与ServiceType.serviceTypeId相关时才有意义,即根据服务类型表示床或座位
我需要编写一个查询,它将返回3列,具体如下:
主持人姓名、床位、座位
我几乎可以肯定,在存储过程中创建和丢弃临时表是一个糟糕的解决方案,它可能会对未来的可伸缩性等产生负面影响,而且该解决方案涉及到服务表上的自连接
到目前为止,我的查询如下所示,但不返回任何行;我错过了什么
SELECT f.facilitatorName,(SUM(ts1.capacity)) as Beds,(SUM(ts2.capacity)) as Seats
FROM dbo.Facilitator as f,
dbo.TestService as ts1,
dbo.TestService as ts2,
dbo.ServiceFacilitator as sf
WHERE f.facilitatorId = sf.facilitatorId AND
(sf.serviceId = ts1.serviceId or
sf.serviceId = ts2.serviceId) and
ts1.serviceId = ts2.serviceId and
ts1.serviceTypeId = '1' and -- type hotel
ts2.serviceTypeId = '2' -- type conference centre
GROUP BY f.facilitatorName
将查询一分为二将返回床和座位的准确结果:
SELECT f.facilitatorName,(SUM(ts1.capacity)) as Beds
FROM dbo.Facilitator as f,
dbo.TestService as ts1,
dbo.ServiceFacilitator as sf
WHERE f.facilitatorId = sf.facilitatorId AND
sf.serviceId = ts1.serviceId and
ts1.serviceTypeId = '1'
GROUP BY f.facilitatorName
SELECT f.facilitatorName,(SUM(ts2.capacity)) as Seats
FROM dbo.Facilitator as f,
dbo.TestService as ts2,
dbo.ServiceFacilitator as sf
WHERE f.facilitatorId = sf.facilitatorId AND
sf.serviceId = ts2.serviceId and
ts2.serviceTypeId = '2'
GROUP BY f.facilitatorName
谢谢。您的查询的简单解决方案应该是:
SELECT f.facilitatorName,
SUM(case when ts.serviceTypeId = '1' then ts.capacity end) as Beds,
SUM(case when ts.serviceTypeId = '2' then ts.capacity end) as Seats
FROM dbo.Facilitator as f
LEFT JOIN dbo.ServiceFacilitator as sf ON f.facilitatorId = sf.facilitatorId
LEFT JOIN dbo.TestService as ts ON sf.serviceId = ts.serviceId
GROUP BY f.facilitatorName
您应该对此查询使用Join。 例如:
SELECT f.facilitatorName,(SUM(ts1.capacity)) as Beds,(SUM(ts2.capacity)) as Seats
FROM
dbo.ServiceFacilitator as sf
join dbo.Facilitator as f
on sf.facilitatorI = f.facilitatorId
join dbo.TestService as ts1
on sf.serviceId = ts1.serviceId
join dbo.TestService as ts1
on sf.serviceId = ts2.serviceId
WHERE
ts1.serviceTypeId = '1' and -- type hotel
ts2.serviceTypeId = '2' -- type conference centre
GROUP BY f.facilitatorName
可能值得一读,您正在使用的连接语法(ANSI 89)过时超过20年,在ANSI 92中被显式联接取代。链接实体
ServiceFacilitator
意味着每个服务可以有多个协导器-如果一个服务确实有多个协导器,是否存在任何类型的容量拆分?@Mark。。真的不确定;就在最后一分钟被拉进来了。还没有完全暴露在工作环境中。。。谢谢你抽出时间来看我。。