Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Новый топик    Ответить
 Inclusion list - как join-нить с минимальными усилиями?  [new]
Nafigator
Member

Откуда:
Сообщений: 216
Есть таблица A, есть таблица "включений" (соответствий) для A - всё очень упрощено.
Нужно так заджойнить эти 2 таблицы, чтобы выполнялось следующее:
1) если есть соответствия A в inclusion - выбираются только они
2) если в inclusion нету соответствий - выбираются все из A

Неужели тут без union, exists, и подобной хрени не обойтись? :(

p.s. для таблицы "ИСключений" (есть у меня и такая) всё просто, а вот включения... :(
15 окт 08, 15:14    [6309948]     Ответить | Цитировать Сообщить модератору
 Re: Inclusion list - как join-нить с минимальными усилиями?  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
Может, всё же ddl таблиц приведёте с примером данных и того, что получить надо?
15 окт 08, 15:59    [6310371]     Ответить | Цитировать Сообщить модератору
 Re: Inclusion list - как join-нить с минимальными усилиями?  [new]
Nafigator
Member

Откуда:
Сообщений: 216
Боюсь, что реальные таблицы сюда не поставлю - там устрашающе много полей, связей, зависимостей. Поэтому я решил на простых примерах.
Ну, скажем, так.

CREATE TABLE TEST.A (
ID INTEGER NOT NULL GENERATED BY DEFAULT
AS IDENTITY (START WITH 1, INCREMENT BY 1, NO CACHE,
NO MINVALUE, NO MAXVALUE, NO CYCLE, ORDER),
NAME VARCHAR(20) NOT NULL
)
IN USERSPACE1;

CREATE TABLE TEST.A_INCL (
ID INTEGER NOT NULL GENERATED BY DEFAULT
AS IDENTITY (START WITH 1, INCREMENT BY 1, NO CACHE,
NO MINVALUE, NO MAXVALUE, NO CYCLE, ORDER),
A_ID INTEGER NOT NULL
)
IN USERSPACE1;

ALTER TABLE TEST.A
ADD CONSTRAINT PK_A PRIMARY KEY
(ID);

ALTER TABLE TEST.A_INCL
ADD CONSTRAINT PK_A_INCL PRIMARY KEY
(ID);

ALTER TABLE TEST.A_INCL
ADD CONSTRAINT FK_A FOREIGN KEY
(A_ID)
REFERENCES TEST.A
(ID)
ON DELETE CASCADE
ON UPDATE NO ACTION;
15 окт 08, 16:31    [6310598]     Ответить | Цитировать Сообщить модератору
 Re: Inclusion list - как join-нить с минимальными усилиями?  [new]
Nafigator
Member

Откуда:
Сообщений: 216
На самом деле A_INCL - это таблица связей: т.е. она включает пары (A, B), где B - еще одна сущность.
Для простоты я ключ B убрал...

Должно работать так
1) A содержит A1, A2, A3
A_INCL содержит пары (A1, B1), (A1, B2), (A3, B1) -> из A надо выбрать только A1 и A3
2) A содержит A1, A2, A3
A_INCL не содержит записей -> A_INCL игнорируется и из A выбираются все Ax
15 окт 08, 16:36    [6310618]     Ответить | Цитировать Сообщить модератору
 Re: Inclusion list - как join-нить с минимальными усилиями?  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4946
Nafigator
На самом деле A_INCL - это таблица связей: т.е. она включает пары (A, B), где B - еще одна сущность.
Для простоты я ключ B убрал...

Должно работать так
1) A содержит A1, A2, A3
A_INCL содержит пары (A1, B1), (A1, B2), (A3, B1) -> из A надо выбрать только A1 и A3
2) A содержит A1, A2, A3
A_INCL не содержит записей -> A_INCL игнорируется и из A выбираются все Ax

select a.*
from a
left join (select distinct a_id from a_incl) d on a.id=d.a_id
left join (select distinct 1 a_id from a_incl) g on 1=1
where g.a_id is null or (g.a_id is not null and d.a_id is not null)
15 окт 08, 16:53    [6310749]     Ответить | Цитировать Сообщить модератору
 Re: Inclusion list - как join-нить с минимальными усилиями?  [new]
Nafigator
Member

Откуда:
Сообщений: 216
Спасибо большое.
Даже разобравшись в том, как работает запрос, всё равно не покидает ощущение, что хитрО сделано... Т.е. нетривиальный подход... :))
15 окт 08, 18:43    [6311474]     Ответить | Цитировать Сообщить модератору
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Ответить