是否可以从联接中的子查询结果中进行选择

时间:2019-10-19 18:34:14

标签: mysql sql

因此,我有一个很大的子查询,我想在连接中使用子查询的结果时对该子查询进行连接。

例如,我有一个名为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的所有过滤器?

谢谢!

1 个答案:

答案 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 . . .
相关问题