Возможно ли упростить данный запрос?
хочу написать запрос который выведет всех людей, у которых есть животное с определённым кодом, если таких людей нет то вывести всех людей. Я написал рабочее решение, но оно выглядит слишком громоздких и не красивым, можно ли как-то это по человечески написать ?
select *
from people p
left join animal a on a.id_people = p.id
where exists(select *
from people p
join animal a on a.id_people = p.id
where a.code = '3-1')
and a.code = '3-1'
or not exists(select *
from people p
join animal a on a.id_people = p.id
where a.code = '3-1')
Спасибо Гончарову Александру, в итоге получилось
select *
from people p
left join animal a on a.id_people = p.id
where CASE
WHEN exists(select *
from people p
join animal a on a.id_people = p.id
where a.code = '3-1') THEN a.code = '3-1'
ELSE TRUE
END;
Я затупил, понял что можно и так сделать
select *
from people p
left join animal a on a.id_people = p.id
where a.code = '3-1'
or not exists(select *
from people p
join animal a on a.id_people = p.id
where a.code = '3-1')
Ответы (1 шт):
То есть false в условие where может получиться только в случае если exists(select * from people p join animal a on a.id_people = p.id where a.code = '3-1') = true , а (a.code = '3-1') = false . То есть если во всей таблице(склеенной из двух) существует запись '3-1', но данная запись не '3-1', только тогда условие where = false. То есть смысл запроса выходит:
Если существуют записи таблицы с '3-1' , то вывести только их, иначе вывести всё.
Воплощаем смысл запроса кодом:
select * from people p left join animal a on a.id_people = p.id
where IF(
exists(select * from people p join animal a on a.id_people = p.id where a.code = '3-1')
, a.code = '3-1'
, 1
);
Учебный чисто пример для взрыва мозга, вроде. На то, что надо сначала смысл запроса понять, а потом перевести смысл обратно в sql. В реальности такие два разные запроса по сути в один паковать не будут даже яростные извращенцы, думаю.