因此,我有一个很大的子查询,我想在连接中使用子查询的结果时对该子查询进行连接。
例如,我有一个名为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
)
问题在于,这将返回每个患者的约会数量,而独立于其上方的子查询。我试着这样编写联接:
function processStream(stream) {
}
但是显然我收到一个错误消息,说表t1不存在。我有什么办法可以干净地执行此操作,而不必重复t2中t1的所有过滤器?
谢谢!
答案 0 :(得分:1)
为什么不使用窗口功能?
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 . . .