Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.07.2017, 11:51   #1
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию запрос с условиями PostgreSQL

Здравствуйте уважаемые гуру SQL

Требуется выполнить сложный запрос из нескольких таблиц PostgreSQL по условию. Структура таблиц проста

главная таблицы
own.id // primary
own.type // условие
own.fld2
.....

подчинённые таблицы 3 штуки (все с одинаковыми структурами но разным наполнением)
табл1 табл2 табл3
child1.id_____ child2.id______child3.id // primary
child1.fld1____child2.fld1____child 3.fld1
child1.fld2____child2.fld2____child 3.fld2
....

связь 1:1 own.id = childN.id причём может быть в нескольких подчинённых таблицах
Допустим у меня следующее наполнение
own.id = 1
own.type = 1
own.fld2 = 'текст'
для типа 1 нужно выбрать все поля табл1 в связке с таблицей own
для типа 2 нужно выбрать все поля табл2 в связке с таблицей own
и.т.п

сейчас есть простой запрос
Код:
SELECT * FROM own O 
 LEFT OUTER JOIN child1 C1 ON C1.id=O.id
 LEFT OUTER JOIN child2 C2 ON C2.id=O.id
 LEFT OUTER JOIN child3 C3 ON C3.id=O.id
WHERE блаблабла
выбираются все записи со всех таблиц в одну строку НО если в подчинённых таблицах нет записей то там всё null

------------
ВОПРОС:
Как написать запрос, чтобы выбирались только 2 набора в зависимости от значений поля own.type

пробовал что-то на подобии этого...

Код:
SELECT O.*, X.* FROM public.owner_table O
  (CASE O.type
     WHEN 1 THEN   LEFT OUTER JOIN public.child1 X on X.id=O.id
     WHEN 2 THEN   LEFT OUTER JOIN public.child2 X on X.id=O.id
     ELSE
      LEFT OUTER JOIN public.owner_table X on X.id=O.id
   END) 
WHERE O.условие_блаблабла
не хочет выбирать

можно ли написать подобный то запрос ?
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 08.07.2017, 12:02   #2
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

нашёл один метод, но какой то он очень громоздкий и смахивает на "быдлокод".
Может можно как то оптимизировать? Не подскажете гуру?
Код:
SELECT O.*
  (CASE O.type
     WHEN 1 THEN  SELECT X.поле1 FROM public.child1 X on X.id=O.id
     WHEN 2 THEN  SELECT X.поле1 FROM public.child2 X on X.id=O.id
     ELSE
       null
   END)  as поле1,

  (CASE O.type
     WHEN 1 THEN  SELECT X.поле2 FROM public.child1 X on X.id=O.id
     WHEN 2 THEN  SELECT X.поле2 FROM public.child2 X on X.id=O.id
     ELSE
       null
   END)  as поле2,
   и так все 8 полей подчинённых таблиц

FROM public.owner_table O
WHERE O.условие_блаблабла
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 08.07.2017, 12:18   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Код:
SELECT O.*,
 (CASE O.type
     WHEN 1 THEN  C1.поле1
     WHEN 2 THEN  C2.поле1
     ELSE null
   END)  as поле1,
...
  FROM own O 
 LEFT OUTER JOIN child1 C1 ON C1.id=O.id
 LEFT OUTER JOIN child2 C2 ON C2.id=O.id
 LEFT OUTER JOIN child3 C3 ON C3.id=O.id
WHERE блаблабла
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 08.07.2017, 12:24   #4
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Аватар, огромное тебе спасибо !
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
впр с 2-мя условиями Фонарик2 Microsoft Office Excel 3 22.08.2016 12:09
цикл с 2-мя условиями komra2 C# (си шарп) 21 18.07.2016 16:10
PostgreSQL. запрос для пары данных, встречающейся >1 раза laovai Помощь студентам 1 25.11.2015 07:10
PostgreSQL 5cek БД в Delphi 17 08.04.2014 12:45
Qt+PostgreSQL almareta Qt и кроссплатформенное программирование С/С++ 0 06.08.2010 10:30