powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Запрос с JOIN
11 сообщений из 11, страница 1 из 1
Запрос с JOIN
    #33774148
autocommit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Люди подскажите пожалуйста как такой запрос можно записать с помощью JOIN:
Код: plaintext
1.
2.
3.
4.
5.
select id_obj, to_char (values, '999999999'), 'NUMERIC' as datatype from tab_num
union
select id_obj, to_char (values, 'HH-MM-YYYY'), 'DATE' as datatype from tab_date
union
select id_obj, values, 'CHAR' as datatype from tab_date;
...
Рейтинг: 0 / 0
Запрос с JOIN
    #33774179
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У Join и union разные предназначения. Зачем вам это понадобилось?
...
Рейтинг: 0 / 0
Запрос с JOIN
    #33774191
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
autocommitЛюди подскажите пожалуйста как такой запрос можно записать с помощью JOIN:
Код: plaintext
1.
2.
3.
4.
5.
select id_obj, to_char (values, '999999999'), 'NUMERIC' as datatype from tab_num
union
select id_obj, to_char (values, 'HH-MM-YYYY'), 'DATE' as datatype from tab_date
union
select id_obj, values, 'CHAR' as datatype from tab_date;
А результат как должен выглядеть? В виде одной строки для каждого ID_OBJ или в виде нескольких строк?
...
Рейтинг: 0 / 0
Запрос с JOIN
    #33774197
autocommit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть список обектов для которых хранится набор значений параметров в разных таблицах различных типов числовые, строчные, и периодические. Для удобства выбора хочу сделать вьюху в которой собрать в кучу все эти параметры с маркером типа.
...
Рейтинг: 0 / 0
Запрос с JOIN
    #33774212
autocommit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владимор Конев autocommitЛюди подскажите пожалуйста как такой запрос можно записать с помощью JOIN:
Код: plaintext
1.
2.
3.
4.
5.
select id_obj, to_char (values, '999999999'), 'NUMERIC' as datatype from tab_num
union
select id_obj, to_char (values, 'HH-MM-YYYY'), 'DATE' as datatype from tab_date
union
select id_obj, values, 'CHAR' as datatype from tab_date;
А результат как должен выглядеть? В виде одной строки для каждого ID_OBJ или в виде нескольких строк?
Можно в виде нескольких строк, а если можно перестроить в виде одной строки было бы вообще замечательно :)
...
Рейтинг: 0 / 0
Запрос с JOIN
    #33774381
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Структуру таблиц и тестовые данные приведи...
...
Рейтинг: 0 / 0
Запрос с JOIN
    #33774477
autocommit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
таблица:
obj_type:
id - serial
name - varchar
1, 'Обуь'

таблица:
obj:
id - serial
obj_type - int4
name - varchar
1,1,'Сапоги'

таблица:
obj_param:
id - serial
obj_type - int4
name - varchar
1,1, 'Размер'
2,1, 'Цвет'
3,1, 'Срок годности' :)

таблица:
tab_date:
id - serial
id_obj - int4
id_obj_par - int4
value - timestamp
1, 1,3, '20.05.2006'

tab_num:
id - serial
id_obj - int4
id_obj_par - int4
value - numeric
1,1,1, 42

tab_str:
id - serial
id_obj - int4
id_obj_par - int4
value - varchar

1,1,2, 'Красный'

да еще у меня в последнем запросе опечатка
select id_obj, values, 'CHAR' as datatype from tab_date;
не tab_date, а tab_str.
Сори :)
...
Рейтинг: 0 / 0
Запрос с JOIN
    #33774661
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На твоих тестовых данных вот что у меня получилось:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
select obj_type.name "Тип товара",
       obj.name "Вид товара",
       max(case when obj_param.id =  1  then obj_param.name||': '||to_char(tab_num.value) else null end) as "Размер",
       max(case when obj_param.id =  2  then obj_param.name||': '||tab_str.value else null end) as "Цвет",
       max(case when obj_param.id =  3  then obj_param.name||': '||to_char(tab_date.value,'dd.mm.yyyy') else null end) as "Срок годности"
  from obj_type
 inner join obj
    on obj.obj_type = obj_type.id
 inner join obj_param
    on obj_param.obj_type = obj_type.id
  left outer join tab_date
    on tab_date.id_obj = obj.id and tab_date.id_obj_par = obj_param.id
  left outer join tab_num
    on tab_num.id_obj = obj.id and tab_num.id_obj_par = obj_param.id
  left outer join tab_str
    on tab_str.id_obj = obj.id and tab_str.id_obj_par = obj_param.id
group by obj_type.name ,
       obj.name

Query finished, retrieving results...

Тип товара   Вид товара     Размер         Цвет            Срок годности
----------   ----------   ----------   -------------   -------------------------
Обуь         Сапоги       Размер:  42    Цвет: Красный   Срок годности:  20 . 05 . 2006 

 1  row(s) retrieved
Думаю, основная идея тебе будет понятна :)
...
Рейтинг: 0 / 0
Запрос с JOIN
    #33774779
autocommit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вау !!! Класс именно то что нужно огромное спасибо !!!
...
Рейтинг: 0 / 0
Запрос с JOIN
    #33776610
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
autocommitВау !!! Класс именно то что нужно огромное спасибо !!!Рад, что тебе понравилось ;)
Хотя, вариант с юнион и дает немного не такой результат...

Кстати, если написать вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
select obj_type.name "Тип товара",
       obj.name "Вид товара",
       coalesce(case when obj_param.id =  1  then obj_param.name||': '||to_char(tab_num.value) else null end,
                case when obj_param.id =  2  then obj_param.name||': '||tab_str.value else null end,
                case when obj_param.id =  3  then obj_param.name||': '||to_char(tab_date.value,'dd.mm.yyyy') else null end
               ) as "Характеристика товара"
  from obj_type
 inner join obj
    on obj.obj_type = obj_type.id
 inner join obj_param
    on obj_param.obj_type = obj_type.id
  left outer join tab_date
    on tab_date.id_obj = obj.id and tab_date.id_obj_par = obj_param.id
  left outer join tab_num
    on tab_num.id_obj = obj.id and tab_num.id_obj_par = obj_param.id
  left outer join tab_str
    on tab_str.id_obj = obj.id and tab_str.id_obj_par = obj_param.id

Query finished, retrieving results...

Тип товара   Вид товара   Характеристика товара
----------   ----------   -------------------------
Обуь         Сапоги       Цвет: Красный
Обуь         Сапоги       Срок годности:  20 . 05 . 2006 
Обуь         Сапоги       Размер:  42 

 3  row(s) retrieved
то получиться как с юнион, только через джойн
...
Рейтинг: 0 / 0
Запрос с JOIN
    #33781487
autocommit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это тоже неплохо для другой задачи. Огромное спасибо за примеры очень помогли разобраться с JOIN.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Запрос с JOIN
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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