[英]Is it possible to select from the result of a subquery in a join
所以我有一个很大的子查询,我想在连接中使用子查询的结果时加入该子查询。
例如,我有一张名为patient
的表,还有一张名为appointment
的表,我想根据给定的标准获取每位患者的预约次数。
现在我正在做这样的事情:
SELECT
t1.*
FROM
(
SELECT
patient.name,
patient.id,
appointment.date
FROM
patient
LEFT JOIN appointment ON appointment.patient_id = patient.id
WHERE
/* a **lot** of filters, additional joins, etc*/
) t1
LEFT JOIN (
SELECT
COUNT(*) number_of_appointments,
patient.id
FROM
patient
LEFT JOIN appointment ON appointment.patient_id = patient.id
GROUP BY
patient.id
) t2 ON t1.id = t2.id
问题在于,这将返回每个患者的预约数量,与上面的子查询无关。 我试着这样写加入:
LEFT JOIN (
SELECT
COUNT(*) number_of_appointments,
patient.id
FROM
t1
GROUP BY
patient.id
)
但显然我收到一个错误,说表 t1 不存在。 有什么方法可以让我干净地做到这一点,而不必重复从 t1 到 t2 的所有过滤器?
谢谢!
为什么不使用 window 函数?
SELECT p.name, p.id, a.date,
COUNT(a.patient_id) OVER (PARTITION BY p.id) as num_appointments
FROM patient p LEFT JOIN
appointment a
ON a.patient_id = p.id
WHERE . . .
这提供了基于WHERE
过滤的计数。 如果您想要计算所有约会,请在应用WHERE
之前进行计算:
SELECT p.name, p.id, a.date,
COALESCE(a.cnt, 0) as num_total_appointments,
COUNT(a.patient_id) OVER (PARTITION BY p.id) as num_matching appointments
FROM patient p LEFT JOIN
(SELECT a.*,
COUNT(*) OVER (PARTITION BY a.patient_id) as cnt
FROM appointment a
) a
ON a.patient_id = p.id
WHERE . . .
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.