Есть ли альтернатива самому присоединиться? - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть следующий запрос.

SELECT 
   v.id,
   v.type,
   COUNT(vn.id) as notice_sent_count,
   COUNT(vn1.id) as total_count
FROM 
     vln v 
     LEFT JOIN notes vn ON(v.note_id = vn.id AND vn.note_datetime IS NOT NULL)
     LEFT JOIN notes vn1 ON(v.note_id = vn1.id)
WHERE 
     v.id = 1
GROUP BY 
     v.id,
     v.type;

Используя самостоятельное объединение, я могу получить извещение об уведомлении и общее количество.Есть ли в любом случае, чтобы достичь того же самого без присоединения.Я пытаюсь удалить 3-е присоединение.Есть идеи?

Sample data 
------------------------------------------
v.id v.type notice_sent_count total_count
------------------------------------------
1    type1        2               5
2    type2        1               3

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Вы также можете использовать CASE:

SELECT 
   v.id,
   v.type,
   SUM(CASE WHEN vn.note_datetime IS NULL THEN 0 ELSE 1 END) AS notice_sent_count,
   COUNT(vn.id) AS total_count
FROM  vln v 
LEFT JOIN notes vn ON v.note_id = vn.id
WHERE v.id = 1
GROUP BY  v.id, v.type;
0 голосов
/ 14 декабря 2018

Вы можете использовать FILTER:

SELECT 
   v.id,
   v.type,
   COUNT(vn.id) FILTER (WHERE vn.note_datetime IS NOT NULL) AS notice_sent_count,
   COUNT(vn.id) AS total_count
FROM  vln v 
LEFT JOIN notes vn ON v.note_id = vn.id
WHERE v.id = 1
GROUP BY  v.id, v.type;

Или даже проще, как @ D Стэнли предлагает:

SELECT 
   v.id,
   v.type,
   COUNT(vn.note_datetime) AS notice_sent_count,
   COUNT(vn.id) AS total_count
FROM  vln v 
LEFT JOIN notes vn ON v.note_id = vn.id
WHERE v.id = 1
GROUP BY  v.id, v.type;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...