powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Select из трех таблиц
10 сообщений из 10, страница 1 из 1
Select из трех таблиц
    #39147532
pvscherbinin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Есть три таблицы:

1. tClient idClient Name
2. tCat idCat Name
3. tClientCat idClientidCatidType

На tClientCat ограничения:
Код: sql
1.
2.
UNIQUE ("idClient", "idType")
CHECK ("DanceType" = ANY (ARRAY[1, 2, 3]))


Результат должен иметь такой вид:
ClientName Cat1 Cat2 Cat3 client1category1 null nullclient2category3 category2 nullclient3category1 category2 category3

Подскажите пожалуйста, как написать запрос, чтобы получить требуемую таблицу?
...
Рейтинг: 0 / 0
Select из трех таблиц
    #39147594
pvscherbinin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select 
	c."Name", result.cat1,result.cat2,result.cat3 
from 
	crosstab($$
	select
		c."idClient",
		c."Name", 
		cat."Name"
	from
		"tClient" c
	left join
		"tClientCat" cc on c."idClient"=cc."idClient"
	left join
		"tCat" cat on cc."idCat"=cat."idCat"
	order by 1
	$$) 
	as result (id integer, cat1 character varying, cat2 character varying, cat3 character varying)
left join
	"tClient" c on c."idClient" = result.id



Поправьте, если есть более оптимальное решение.
...
Рейтинг: 0 / 0
Select из трех таблиц
    #39147611
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть одно ограничение, нельзя динамически менять состав полей.
Если появится четвертая категория, то необходимо переписывать запрос.
...
Рейтинг: 0 / 0
Select из трех таблиц
    #39147618
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-trotЕсли появится четвертая категория, то необходимо переписывать запрос.
см. crosstab
http://www.postgresql.org/docs/9.5/static/tablefunc.html
...
Рейтинг: 0 / 0
Select из трех таблиц
    #39147647
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pvscherbininболее оптимальное решение.crosstab придуманного для кодеров, неосиливших group by.
классический pivot легко реализуется без привлечения расширения.
...
Рейтинг: 0 / 0
Select из трех таблиц
    #39147653
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p2.,

переменное число столбцов на plain sql с помощью group by?
...
Рейтинг: 0 / 0
Select из трех таблиц
    #39147689
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tadminпеременное число столбцов на plain sql с помощью group by?так же, как и в случае crosstab(), только что в одном случае не указываются типы значений, а в другом состав категорий. Только вот crosstabный неявный маппинг категрий на колонки за счет сортировки чреват трудно диагностируемыми неожиданностями.
И, к тому же, странно полагать динамичность формирования полей запроса, но статично ограничивать структуру.
pvscherbininUNIQUE ("idClient", "idType")
CHECK ("DanceType" = ANY (ARRAY[1, 2, 3]))
...
Рейтинг: 0 / 0
Select из трех таблиц
    #39147880
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tadmin см. crosstab
http://www.postgresql.org/docs/9.5/static/tablefunc.html
Еще раз освежил в памяти. Функции расширения tablefunc возвращают тип данных record. Для того чтобы обработать этот тип
необходимо определить его структуру, это определение выполняется в запросе, например

Код: sql
1.
 ... as result (id integer, cat1 character varying, cat2 character varying, cat3 character varying) ...



Если в таблицу tCat добавиться еще одна категория, например category4, то необходимо как минимум задать новую структуру record.

А это, как я понимаю, необходимо переписать запрос.

Если я не прав, готов выслушать замечания.
...
Рейтинг: 0 / 0
Select из трех таблиц
    #39148016
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-trot необходимо как минимум задать новую структуру record.
А это, как я понимаю, необходимо переписать запрос.
Верно. Потребуется динамический sql и исполнение через execute. Не слишком удобно, и код плохо читается.
...
Рейтинг: 0 / 0
Select из трех таблиц
    #39148282
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я именно это и хотел донести коллеге.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Select из трех таблиц
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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