条件子句中的用例语句

时间:2018-12-24 17:57:53

标签: mysql postgresql

使用相同的查询,我试图列出未发送的通知。我更接近查询,但是陷入了如何基于某些条件在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中执行条件语句?

1 个答案:

答案 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 )

;