powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Опять к 2 проблемам - автоинкрементное поле в результате запроса или борьба с cross join
7 сообщений из 7, страница 1 из 1
Опять к 2 проблемам - автоинкрементное поле в результате запроса или борьба с cross join
    #32988157
strizh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть 2 таблицы с некоторыми описаниями, подчиненные третьей.

create table tab1 (id serial, header_id integer not null, date1 date not null, summa1 float8 not null);
create table tab2 (id serial, header_id integer not null, date2 date not null, summa2 float8 not null);
create table tab3 (header_id serial, obj_descript text ... не суть важно);

Для каждого header_id в tab1, tab2 может быть от 0 до ~100 записей.

Нужно построить запрос, который выберет по условию header_id = <нужный> поля
date1, summa1, date2, summa2
в столько записей, сколько есть в максимальном из двух наборов по tab1, tab2.
Немного путано :( Пример. Для header_id=6 в tab1 2 записи, в tab2 - 1 запись:
select date1, summa1, date2, summa2 from tab1 cross join tab2 where tab1.header_id=6 and tab2.header_id=6
возвращает
date1 summa1 date2 summa2
---------- --------------- ---------- ---------------
2005-03-22 1 2005-01-01 3.7000000000000
2005-03-11 -3 2005-01-01 3.7000000000000

а надо, чтобы во второй строке date2 и summa2 были пустыми.

Если давать запрос
select date1, summa1, null date2, null summa2 from tab1 where tab1.header_id=6 union all select null as date1, null as summa1, date2, summa2 from tab2 where tab2.header_id=6
то получаются 3 строки - тоже не подходит:
date1 summa1 date2 summa2
---------- --------------- ---------- ---------------
2005-03-22 1
2005-03-11 -3
2005-01-01 3.7000000000000

Логично в первом варианте запроса вместо cross join написать full join (именно full join оставляет левые или правые части объединения пустыми, если нет соответствующих записей). Вот только по чему ставить условие on ?
Если on tab1.header_id = tab2.header_id, то результат не изменится. Вроде как нужно условие on ставить по полю номера записи в результирующем наборе, т.е. чтобы набор по tab1 имел поле со значениями 1, 2, а набор по tab2 - только 1. Возвращаемся к проблеме простого получения автоинкрементного поля в запросе, которая уже обсуждалась здесь. Народ тогда пришел к выводу, что без
create temp sequence ...
никак ... :( А хотелось бы красивше решение найти !
...
Рейтинг: 0 / 0
Опять к 2 проблемам - автоинкрементное поле в результате запроса или борьба с cross join
    #32988244
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я так понимаю, что Вам (tabl1 full join tabl2) надо связать INNER JOIN к table3
...
Рейтинг: 0 / 0
Опять к 2 проблемам - автоинкрементное поле в результате запроса или борьба с cross join
    #32989679
strizh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще раз.
Исходные таблицы.
tab3:
header_id descript
--------- ---------------
6 установка_124
tab1:
id header_id date1 summa1
-- ---------- ------ -------
7 6 2005-03-22 1
12 6 2005-03-11 -3
tab2:
id header_id date2 summa2
-- ---------- ------ -------
19 6 2005-01-01 3.70

Результатом запроса должно быть:
date1 summa1 date2 summa2
------ ------- ------ -------
2005-03-22 1 2005-01-01 3.70
2005-03-11 -3
...
Рейтинг: 0 / 0
Опять к 2 проблемам - автоинкрементное поле в результате запроса или борьба с cross join
    #32991498
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Другой формат выдачи, но может подойдет?

select 'tab1' as source, date1 as date, summa1 as summa from tab1 where header_id=6
union
select 'tab2' as source, date2 as date, summa2 as summa from tab2 where header_id=6;
...
Рейтинг: 0 / 0
Опять к 2 проблемам - автоинкрементное поле в результате запроса или борьба с cross join
    #32991651
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://archives.postgresql.org/pgsql-general/2005-02/msg01403.php
...
Рейтинг: 0 / 0
Опять к 2 проблемам - автоинкрементное поле в результате запроса или борьба с cross join
    #32998967
strizh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drop function Counter(integer);
create function Counter(integer) returns integer as '
global GD
set GD(Counter$1) [expr $GD(Counter$1) + 1]
return $GD(Counter$1)
' language 'pltcl';

drop function Reset_Counter(integer);
create function Reset_Counter(integer) returns integer as '
global GD
set GD(Counter$1) 0
return $GD(Counter$1)
' language 'pltcl';

select Reset_Counter(1);
select Counter(1);

Получаем в программе нужное количество счетчиков. Щас испытаю быстродействие.
...
Рейтинг: 0 / 0
Опять к 2 проблемам - автоинкрементное поле в результате запроса или борьба с cross join
    #32998981
strizh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без группировок - на скорость не влияет. С группировками - получил на 5% ниже скорость.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Опять к 2 проблемам - автоинкрементное поле в результате запроса или борьба с cross join
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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