Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Помогите составить хитрый запрос / 6 сообщений из 6, страница 1 из 1
26.07.2010, 17:59
    #36760278
Who am I
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить хитрый запрос
Не знаю, возможно ли это какими-то простыми средствами..

Есть таблица, в ней три поля:

IS_INTEREST
IS_OFFER
IS_CONTRACT

Есть три запроса, к примеру:

select ctp.* from CMD_TASK_PRODUCT ctp where ctp.TASK_ID=29 and ctp.IS_INTEREST=1
select ctp.* from CMD_TASK_PRODUCT ctp where ctp.TASK_ID=29 and ctp.IS_OFFER=1
select ctp.* from CMD_TASK_PRODUCT ctp where ctp.TASK_ID=29 and ctp.IS_CONTRACT=1


первый выдает 3 строки, второй выдает 1 строку, третий выдает 2 строки

вопрос.

можно ли сделать так, чтобы выбрать все это одним запросом и добить null как в full outer join то, чего нет
...
Рейтинг: 0 / 0
26.07.2010, 18:11
    #36760307
GVF112GVF
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить хитрый запрос
Who am I,

Посмотри примеры в DB2 SQL Cookbook -
http://mysite.verizon.net/Graeme_Birchall/cookbook/DB2V95CK.PDF

С уважением,
Вадим.
...
Рейтинг: 0 / 0
27.07.2010, 05:00
    #36760786
golsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить хитрый запрос
Код: plaintext
1.
2.
select distinct ctp.* 
  from CMD_TASK_PRODUCT ctp 
 where ctp.TASK_ID= 29  and (ctp.IS_INTEREST= 1  or ctp.IS_OFFER= 1  or  ctp.IS_CONTRACT= 1 )
...
Рейтинг: 0 / 0
27.07.2010, 09:56
    #36760944
Who am I
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить хитрый запрос
golsa
Код: plaintext
1.
2.
select distinct ctp.* 
  from CMD_TASK_PRODUCT ctp 
 where ctp.TASK_ID= 29  and (ctp.IS_INTEREST= 1  or ctp.IS_OFFER= 1  or  ctp.IS_CONTRACT= 1 )


не то, надо чтобы все три выборки попали в одну не как в union, а как в join

т.е. допустим у нас на выходе:

Код: plaintext
select ctp.* from CMD_TASK_PRODUCT ctp where ctp.TASK_ID= 29  and ctp.IS_INTEREST= 1 :

Код: plaintext
1.
2.
3.
4.
task_id product_id

 29         3 
 29         4 

Код: plaintext
select ctp.* from CMD_TASK_PRODUCT ctp where ctp.TASK_ID= 29  and ctp.IS_OFFER= 1 

Код: plaintext
1.
2.
3.
task_id product_id

 29         2 

Код: plaintext
select ctp.* from CMD_TASK_PRODUCT ctp where ctp.TASK_ID= 29  and ctp.IS_CONTRACT= 1 

Код: plaintext
1.
2.
3.
4.
5.
task_id product_id

 29         1 
 29         22 
 29         23 

На основе этих выходных данных мне нужно получить такое:

Код: plaintext
1.
2.
3.
4.
5.
task_id product_id_interest product_id_offer product_id_contract

 29         3                           2                        1 
 29         4                          null                    22 
 29        null                      null                    23 

Т.е. чтобы результат был скомпонован и количество строк равнялось наибольшему количеству результатов из всех трех выборок, а остальные колонки добивались null при необходимости.
...
Рейтинг: 0 / 0
27.07.2010, 09:59
    #36760954
Who am I
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить хитрый запрос
Да, прошу прощения, мое первое сообщение было не очень информативным и могло ввести в заблуждение.
...
Рейтинг: 0 / 0
27.07.2010, 11:17
    #36761151
Who am I
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить хитрый запрос
Решил таким образом, спасибо коллеге по работе:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
with dummy(id) as (
    select  1  from SYSIBM.SYSDUMMY1    
    union all
    select id +  1  from dummy where id < (select get_max_products_for_task( 29 ) from SYSIBM.SYSDUMMY1)
)
select dummy.id, interestTasks.product_id as interestProductId, offerTasks.product_id as offerProductId, contractTasks.product_id as contractProductId from dummy 
left outer join (select ctp.product_id, rownumber() over() as rn from CMD_TASK_PRODUCT ctp where ctp.TASK_ID= 29  and ctp.IS_INTEREST= 1 ) interestTasks on interestTasks.RN=dummy.ID
left outer join (select ctp.product_id, rownumber() over() as rn from CMD_TASK_PRODUCT ctp where ctp.TASK_ID= 29  and ctp.IS_OFFER= 1 ) offerTasks on offerTasks.RN=dummy.ID
left outer join (select ctp.product_id, rownumber() over() as rn from CMD_TASK_PRODUCT ctp where ctp.TASK_ID= 29  and ctp.IS_CONTRACT= 1 ) contractTasks on contractTasks.RN=dummy.ID;

Сделал последовательность, которая равна максимальному количеству из трех выборок (через функцию), потом сджойнил все три таблицы по row number.

Если кто знает путь попроще - поделитесь :)
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Помогите составить хитрый запрос / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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