Поиск подходящих строк и пробелов - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть таблица пользователей и таблица электронных подписей - я хочу иметь возможность показать для данного документа, кто подписал, а кто нет.

Допустим, у нас есть сотрудники:

EID   Name
1     Bob
2     Tom
3     Fred

подпись:

EID    Document Signature
1      1        Bob
1      2        Bob
1      3        Bob
2      1        Tom
3      2        Fred

Моя проблема в том, что я могу заставить это работать нормально для документа 4 - так как никто не подписал, я могу посмотреть, где документ нулевой

Однако, если я, например, посмотрю на документ 2, я в настоящее время пропускаю сотрудников из списка

Для документа 2 я хотел бы видеть

EID Signature
1   Bob
2 
3   Fred

Для документа 4 я хотел бы видеть:

EID Signature
1
2 
3

и для документа 1:

EID Signature
1   Bob
2   Tom
3

запрос, который я пытался использовать:

SELECT e.eid, s.signature 
from employees e 
left join signatures s on e.eid=s.eid 
where s.document=? or s.document IS NULL group by e.eid

1 Ответ

0 голосов
/ 01 ноября 2018

Есть несколько проблем:

  • Всякий раз, когда используется Left Join, любые условия Where в таблицах справа должны указываться в предложении On. В противном случае, он отфильтрует ваш набор результатов, даже если нет подходящей строки (потеря цели Left Join) /
  • Для сравнения null значений мы используем IS NULL. = null не работает. В этом случае, если мы переместим условия в условие On, нам также не нужно проверять значения null.
  • Group By использование недопустимо и действительно не требуется. При использовании Group By только агрегированные столбцы или столбцы, указанные в Group By, должны содержать Select. См .: https://stackoverflow.com/a/41887524/2469308

Попробуйте следующее:

SELECT e.eid, s.signature 
FROM employees e 
LEFT JOIN signatures s 
  ON e.eid=s.eid AND 
     s.document = ?
...