Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Опять к 2 проблемам - автоинкрементное поле в результате запроса или борьба с cross join
|
|||
|---|---|---|---|
|
#18+
Есть 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 ... никак ... :( А хотелось бы красивше решение найти ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2005, 11:54 |
|
||
|
Опять к 2 проблемам - автоинкрементное поле в результате запроса или борьба с cross join
|
|||
|---|---|---|---|
|
#18+
я так понимаю, что Вам (tabl1 full join tabl2) надо связать INNER JOIN к table3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2005, 12:23 |
|
||
|
Опять к 2 проблемам - автоинкрементное поле в результате запроса или борьба с cross join
|
|||
|---|---|---|---|
|
#18+
Еще раз. Исходные таблицы. 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2005, 19:14 |
|
||
|
Опять к 2 проблемам - автоинкрементное поле в результате запроса или борьба с cross join
|
|||
|---|---|---|---|
|
#18+
Другой формат выдачи, но может подойдет? 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; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2005, 16:14 |
|
||
|
Опять к 2 проблемам - автоинкрементное поле в результате запроса или борьба с cross join
|
|||
|---|---|---|---|
|
#18+
http://archives.postgresql.org/pgsql-general/2005-02/msg01403.php ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2005, 16:56 |
|
||
|
Опять к 2 проблемам - автоинкрементное поле в результате запроса или борьба с cross join
|
|||
|---|---|---|---|
|
#18+
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); Получаем в программе нужное количество счетчиков. Щас испытаю быстродействие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2005, 19:05 |
|
||
|
|

start [/forum/topic.php?fid=53&fpage=344&tid=2007337]: |
0ms |
get settings: |
10ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 273ms |
| total: | 421ms |

| 0 / 0 |
