заявление об использовании в условном выражении where - PullRequest
0 голосов
/ 24 декабря 2018

Используя тот же запрос, я пытаюсь перечислить уведомления, которые не были отправлены.Я ближе к запросу, но застрял в том, как выполнить несколько условий в предложении 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 )

Я хочу соединить следующий SQL-кодкогда vn.id NOT NULL

*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 голосов
/ 24 декабря 2018

Просто предложение
Вы оставили столбец таблицы соединений, в котором эта работа работает как внутреннее объединение. Вы должны переместить условие для таблицы с левым соединением из положения ВКЛ

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 )

;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...