Звучит так, как будто вы хотите полное внешнее соединение, но вам нужно соединиться по общему идентификатору между таблицами.В данный момент вы присоединяетесь к дате, которая объединит все строки в check_in для даты со всеми строками из check_out для даты (т. Е. Если у вас было 5 человек, зарегистрировавшихся и вышедших в день примера, вы 'вернул 25 строк)Таким образом, предполагая, что name
является идентификатором, вы бы сделали что-то вроде:
SELECT a.name,a.timein,a.signature,b.timeout,b.signature, b.name
FROM check_in a
FULL OUTER JOIN check_out b ON a.name = b.name
and a.datein = b.dateout
WHERE a.datein = '2019-01-28'
OR b.dateout = '2019-01-28';
Я включил b.name
в результат, потому что, если кто-то проверил, но не в, то вы бы не сталиполучить значение для a.name
.
Другой вариант может заключаться в объединении, поэтому используйте что-то вроде:
SELECT a.name,a.timein,a.signature,b.timeout,b.signature
FROM check_in a
LEFT OUTER JOIN check_out b ON a.name = b.name
and a.datein = b.dateout
WHERE a.datein = '2019-01-28'
UNION
SELECT co.name, '', '', co.timeout, co.signature
FROM check_out co
where not exists (SELECT 1
FROM check_in ci
WHERE ci.name = co.name
AND ci.datein = co.dateout)
AND co.dateout = '2019-01-28'
Таким образом, верхняя половина запроса будет возвращать совпадения, а те, у которых есть регистрация и извлечение, - вместес теми, у кого есть регистрация, но не выписка, а нижняя половина выбирает тех, у кого выписка, но нет соответствующей регистрации, однако возвращает имя check_out в первом столбце, поэтому имя столбца 1 всегда будет иметь имя.
Тогда вы можете взять это оттуда, как вы хотите получить.