У меня есть стол с несколькими людьми в одном номере
Мне нужно сопоставить в наборе, а затем отобразить каждого человека в качестве первого идентификатора только один раз с их списком соседей по комнате.
Поскольку их больше, чем два, я сталкиваюсь со сценариями, в которых у меня есть несколько результатов, где Первый Идентификатор указан в списке несколько раз, а соседние по комнате упорядочены по-разному, или я могу вернуть только одну строку с 4 идентификаторами
Пример:
У меня есть такая таблица:
Table Name: ROOM_LIST
ID | BUILDING | SUITE | ROOM
01 | BU_1 | SU_1 | RO_1
02 | BU_1 | SU_1 | RO_2
03 | BU_1 | SU_1 | RO_3
04 | BU_1 | SU_1 | RO_4
05 | BU_1 | SU_2 | RO_1
06 | BU_1 | SU_2 | RO_2
07 | BU_2 | SU_1 | RO_1
08 | BU_2 | SU_1 | RO_2
Я попробовал запрос, подобный этому:
select A.ID as Primary,
B.ID as Roomate_1,
C.ID as Roomate_2,
D.ID as Roomate_3,
A.BUILDING as Building,
A.SUITE As Suite,
A.ROOM As Room
from ROOM_LIST A
Left Join ROOM_LIST B on A.BUILDING = B.BUILDING and A.SUITE = B.SUITE
Left Join ROOM_LIST C on A.BUILDING = C.BUILDING and A.SUITE = C.SUITE
Left Join ROOM_LIST D on A.BUILDING = D.BUILDING and A.SUITE = D.SUITE
where A.ID > B.ID
and A.ID > C.ID
and A.ID > D.ID
and B.ID > C.ID
and B.ID > D.ID
and C.ID > D.ID
order by Primary,Roomate_1,Roomate_2,Roomate_3,Building,Suite,Room;
Это избавляет от лишних дубликатов, но я получаю только одну строку на набор вместо одной строки с каждым идентификатором в качестве основного.
Также попробовал подобный, но с <> или! = Вместо>, и тогда я получаю несколько дубликатов с одним идентификатором в качестве первого, но 2, 3 и 4 меняются местами, так что они технически не являются дубликатами.
Вот почему я говорю "не идентичные" дубликаты:)
Мой результат Результаты будут выглядеть так:
| Primary | Roomate_1 | Roomate_2 | Roomate_3 | Building | Suite | Room
| 01 | 02 | 03 | 04 | BU_1 | SU_1 | RO_1
| 02 | 03 | 04 | 01 | BU_1 | SU_1 | RO_2
| 03 | 04 | 01 | 02 | BU_1 | SU_1 | RO_3
| 04 | 01 | 02 | 03 | BU_1 | SU_1 | RO_4
| 05 | 06 | Null | Null | BU_1 | SU_2 | RO_1
| 06 | 05 | Null | Null | BU_1 | SU_2 | RO_2
Я пробовал несколько запросов с разным подвыбором в операторе select или from, но, похоже, я не могу свести его к одному результату для идентификатора в качестве основного. Я пытался сделать сводку, но (мое понимание) сработало бы, только если у меня был один и тот же идентификатор с несколькими результатами, и я хотел превратить несколько результатов в столбцы.
Мысль о союзе, но я не знаю, как сделать запрос через профсоюзы? если это даже вещь
Буду признателен за любую помощь
РЕДАКТИРОВАТЬ: решение ниже работает только в 12C , но мне нужно решение 11G:
with dt as (
select 01 id , 'BU_1' building, 'SU_1' suite ,'RO_1' room from dual union all
select 02 id , 'BU_1' building, 'SU_1' suite ,'RO_2' room from dual union all
select 03 id , 'BU_1' building, 'SU_1' suite ,'RO_3' room from dual union all
select 04 id , 'BU_1' building, 'SU_1' suite ,'RO_4' room from dual union all
select 05 id , 'BU_1' building, 'SU_2' suite ,'RO_1' room from dual union all
select 06 id , 'BU_1' building, 'SU_2' suite ,'RO_2' room from dual union all
select 07 id , 'BU_2' building, 'SU_1' suite ,'RO_1' room from dual union all
select 08 id , 'BU_2' building, 'SU_1' suite ,'RO_2' room from dual )
SELECT
A.ID as Primary,
( select id from (select id,rownum rn from dt b where a.building = b.building AND a.suite = b.suite and b.ID != a.ID order by id ) where rn=1) Roomate_1,
( select id from (select id,rownum rn from dt b where a.building = b.building AND a.suite = b.suite and b.ID != a.ID order by id ) where rn=2) Roomate_2,
( select id from (select id,rownum rn from dt b where a.building = b.building AND a.suite = b.suite and b.ID != a.ID order by id ) where rn=3) Roomate_3,
a.BUILDING as Building,
A.SUITE As Suite,
A.ROOM As Room
FROM
dt a
order by Primary,Roomate_1,Roomate_2,Roomate_3,Building,Suite,Room
Я добавил следующее к одному из приведенных ответов: and b.ID != a.ID
и изменил rn=2 to rn=1
, чтобы начать отсчет из-за 0