Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Выбрать все совпадения / 4 сообщений из 4, страница 1 из 1
22.06.2017, 11:02
    #39476048
mrvap
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать все совпадения
Доброго времени суток!

Есть таблица exp и подчиненная таблица expcheck
Код: sql
1.
2.
3.
4.
select exp_id, exp_lab.* from exp 
left join exp_lab on exp_lab_expid=exp_id
where exp_year=2015
and exp_id in (select expcheck_expid from expcheck where expcheck_clsid  in (1024,1025))


как видно, этот запрос возвращает если есть хоть одно совпадение,
а нужно выбрать только те записи первой таблицы которой принадлежат и 1024 и 1025 второй таблицы
на ум приходит только через crosstab, но это не подходит

Такой запрос дает нужный результат, но это тоже не подходит, так как значений множество.
Код: sql
1.
2.
3.
4.
5.
select exp_id, exp_lab.* from exp 
left join exp_lab on exp_lab_expid=exp_id
where exp_year=2015
and exp_id in (select expcheck_expid from expcheck where expcheck_clsid = 1024)
and exp_id in (select expcheck_expid from expcheck where expcheck_clsid = 1025)



Помогите решить!
...
Рейтинг: 0 / 0
22.06.2017, 11:09
    #39476052
Legushka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать все совпадения
mrvap,
Код: sql
1.
2.
3.
4.
select exp_id, exp_lab.* from exp 
join lateral (select count(distinct expcheck_clsid) as t from expcheck where exp_id = expcheck_expid and expcheck_clsid  in (1024,1025)) t on t.t = 2
left join exp_lab on exp_lab_expid=exp_id
where exp_year=2015


может быть так попробовать? но нужно смотреть план выполнения, вдруг вариант не очень.
...
Рейтинг: 0 / 0
22.06.2017, 11:11
    #39476054
Legushka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать все совпадения
не совсем понятно в запросе какие колонки из каких таблиц, вы бы добавили для удобства алиасы
если у вас in в подтаблице берется из таблицы которая в left join
то это уже не left join

тогда надо делать так:
Код: sql
1.
2.
3.
4.
select exp_id, exp_lab.* from exp 
join exp_lab on exp_lab_expid=exp_id
join lateral (select count(distinct expcheck_clsid) as t from expcheck where exp_id = expcheck_expid and expcheck_clsid  in (1024,1025)) t on t.t = 2
where exp_year=2015
...
Рейтинг: 0 / 0
22.06.2017, 12:30
    #39476111
mrvap
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать все совпадения
Legushka,

Спасибо, да это лучший вариант из имеющихся у меня
с having'ом работает быстрее, а distinct думаю не нужен
Код: sql
1.
2.
3.
join lateral (select count(expcheck_clsid) as t from expcheck where exp_id = expcheck_expid 
and expcheck_clsid in (1024,1025)
having count(expcheck_clsid)=2) t on t.t = 2


но тоже немного не подходит
самое идеально
Код: sql
1.
2.
3.
4.
select exp_id, exp_lab.* from exp 
left join exp_lab on exp_lab_expid=exp_id
where exp_year=2015
and lab1=true and lab2=true and lab3 is null and lab4 is null



exp_lab - это crosstab от expcheck, в данном случае он для контроля и left join правильно, так как и отсутствующие значения тоже надо видеть
lab1-1024
lab2-1025
lab3-1026
.....
lab10000-10024

Наверное все таки единственное решение через динамический crosstab, если есть еще мысли какие - поделитесь!
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Выбрать все совпадения / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]