Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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 - Fatal编程技术网

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。。真的不确定;就在最后一分钟被拉进来了。还没有完全暴露在工作环境中。。。谢谢你抽出时间来看我。。