假设我们有一个表booking
,其中peopleid
可以有多个预订。找到至少预订active
的人的最佳方式是什么?其他预订值为cancelled
,closed
我在想这个,但我觉得必须有一个更有效的方法:
select a.peopleid
, sum(case status.status_desc when 'active' then 1 else 0 end) as counted
from booking a
inner join people
on a.peopleid = people.peopleid
inner join status
on a.statusid = status.statusid
group by a.personid
我计划对此进行left join
以获得一个简单的yes
或no
指标,以确定一个人是否至少有一个有效预订
预订金额为bookingid|statusid|peopleid
,1人可以预订多次
答案 0 :(得分:1)
如果您只是想找到至少有一个有效预订的人,只需执行一个简单的JOIN
并将所需状态放在WHERE
子句中。
SELECT DISTINCT a.peopleid
FROM booking AS b
JOIN status AS s ON b.statusid = s.statusid
WHERE s.status_desc = 'active'
没有必要加入people
(除非您想获得有关此人的其他信息,但问题中未显示)。而且没有必要计算比赛数;如果没有符合status_desc = 'active'
条件的行,则JOIN
不会返回这些行。当有人有多次预订时,SELECT DISTINCT
会删除重复项。
答案 1 :(得分:1)
您可以使用EXiSTS检查哪个用户至少有一个符合条件的预订。
select p.peopleid
from people p
where exists (select 1
from booking b
join status s
where b.peopleid = p.peopleid
s.statusid = b.statusid
and s.status_desc = 'active');
答案 2 :(得分:0)
只需将count与WHERE子句一起使用。
PrintOut
答案 3 :(得分:0)
为什么不进行简单的加入:
select p.* from people p
join booking b on b.peopleid = a.peopleid
join status on status.statusid = b.statusid
where status.status_desc = 'active'
如果您不需要来自其他人的任何其他信息,例如他们的姓名,地址..那么您可以跳过人员表并从预订表中获取ID。