Решение проблемы сделано в PL / SQL, как это будет выглядеть в SQL? - PullRequest
7 голосов
/ 10 ноября 2010

Я написал решение проблемы с использованием PL / SQL и SQL, и я не могу не думать, что это можно сделать на 100% в SQL, но я изо всех сил пытаюсь начать.

Вотструктура двух таблиц (если это помогает, сценарии для их создания находятся в конце вопроса)

Таблица t1 (первичный ключ - оба отображаемых столбца)

ID    TYPE
1     A
1     B
1     C

2     A
2     B

3     B

Столбец типа представляет собой внешний ключ к таблице T2, который содержит следующие данные:

Таблица t2 (первичный ключ - тип)

Type    Desc
A       xx

B       xx

C       xx

Таким образом, учитывая данные в T1, нужный мне результат будетбыть:

Для идентификатора 1, потому что он имеет все типы в таблице внешнего ключа, я бы возвратил литерал "Все"

Для идентификатора 2, потому что он имеет два типа, которые я хотел бы вернуть "A & B "(обратите внимание на разделитель)

И, наконец, для идентификатора 3, потому что он имеет один тип, который я хотел бы вернуть просто" B "

Как и обещано здесь, скрипты для создания всехупомянутые объекты

create table t2(type varchar2(1),
                description varchar2(100)
                )                
/

insert into t2
values ('A', 'xx')
/

insert into t2
values ('B', 'xx')
/

insert into t2
values ('C', 'xx')
/

alter table t2 add constraint t2_pk primary key (type)
/

create table t1 (id number(10),
                 type varchar2(1)
                 )
/

alter table t1 add constraint t1_pk primary key(id, type)
/

alter table t1 add constraint t1_fk foreign key (type) 
references t2(type)
/

insert into t1
values (1, 'A') 
/

insert into t1
values (1, 'B')
/

insert into t1
values (1, 'C')
/

insert into t1
values (2, 'A')
/

insert into t1
values (2, 'B')
/

insert into t1
values (3, 'B')
/

1 Ответ

5 голосов
/ 10 ноября 2010

Примерно так должно получиться то, что вы ищете:

select
    id,
    case
        when cnt = (select count(distinct type) from t2)
        then 'All'
        else ltrim(sys_connect_by_path(type,' & '),' &')
    end types   
from (
    select
        t1.id,
        t2.type,
        count(*) over (partition by t1.id) cnt,
        row_number() over (partition by t1.id order by t2.type) rn
    from
        t1
        inner join t2
            on t2.type = t1.type
)
where
    rn = cnt
    start with rn = 1
    connect by prior id = id and prior rn = rn-1;

Я бы ответил на ваш вопрос +10, если бы смог опубликовать ваш скрипт создания объекта / данных!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...