使用相同的查询,我试图列出未发送的通知。我更接近查询,但是陷入了如何基于某些条件在where子句中执行几个条件的问题。
我尝试了以下查询。
SELECT
vtn.*,
vn.v_notice_datetime
FROM
v_templates vt
JOIN v_template_notices vtn ON (vtn.v_template_id = vt.id)
JOIN violations v ON( v.v_template_id = vt.id )
LEFT JOIN vnotices vn ON(vn.vtemplate_notice_id = vtn.id)
WHERE
v.id = 1
AND vn.v_notice_datetime IS NULL
AND vtn.id > (
SELECT max(vn.vtemplate_notice_id)
FROM vnotices vn
WHERE vn.vnotice_datetime IS NOT NULL )
当 vn.id不为空
时,我想合并以下sql代码*AND vtn.id > ( SELECT max(vn.v_template_notice_id)
FROM v_notices vn WHERE vn.v_notice_datetime IS NOT NULL)*
CASE语句是不错的选择还是其他选择?在研究中发现CASE语句会降低性能,但是我不确定如何在PostgreSQL / MySql中执行条件语句?
答案 0 :(得分:0)
只是一个建议
您已将连接表列留在其中作为内部连接使用..
您应该将左连接表的条件从何处移到ON条件
SELECT
vtn.*,
vn.v_notice_datetime
FROM v_templates vt
JOIN v_template_notices vtn ON (vtn.v_template_id = vt.id)
JOIN violations v ON( v.v_template_id = vt.id )
LEFT JOIN vnotices vn ON(vn.vtemplate_notice_id = vtn.id) AND vn.v_notice_datetime IS NULL
WHERE v.id = 1
AND vtn.id > (
SELECT max(vn.vtemplate_notice_id)
FROM vnotices vn
WHERE vn.vnotice_datetime IS NOT NULL )
;