Отображение значений listagg на основе значений в другом столбце (часть 2) - PullRequest
0 голосов
/ 17 мая 2018

Ранее я публиковал аналогичный вопрос здесь: Отображение значений LISTAGG в ячейке на основе значения другого столбца .

В этом вопросе я использовал UPDATE для хранения списка, разделенного запятыми.

Я получил решение для этого, но благодаря авторам понял, что это не лучший способ сделать это.

Я использую Oracle APEX и мне нужно отобразить эти данные в таблице.

ID   Schedule     Days
001  Weekend      Saturday, Sunday

У меня есть 3 таблицы для работы. Для простоты это DAYS, SCHEDULES и DAY_SCHEDULES.

DAYS table
Day_ID - PK
Day_Order
Day_Name
Schedule (I added this column myself, the others were already provided)

SCHEDULES table
Schedule_ID - PK
Schedule (only two possible values: 'Weekend' or 'Weekday')
Days
Several other columns but not relevant

DAY_SCHEDULES table
Day_schedules_id - PK
Schedule_ID - FK
Day_ID - FK

Я пробовал несколько способов, чтобы в столбце «Дни» отображался список соответствующих дней, но ни один из них не работает. Мои основные попытки - возиться с инструкциями SELECT / CASE, но они по-прежнему не будут отображать ничего, даже если синтаксис будет правильным.

Я не могу создать FK между двумя таблицами, поскольку ни один из столбцов расписаний не является уникальным.

Я не уверен, что делать дальше, поэтому любая помощь или советы приветствуются!

Спасибо,

Hassan

1 Ответ

0 голосов
/ 17 мая 2018

Я думаю, что это то, чего вы пытаетесь достичь (вам не нужен столбец DAYS в таблице расписания, поскольку вы можете рассчитать его по таблице дней):

SQL Fiddle

Настройка схемы Oracle 11g R2 :

CREATE TABLE DAYS ( Day_ID, Day_Order, Day_Name, Schedule ) AS
SELECT LEVEL,
       LEVEL - 1,
       TO_CHAR(
         TRUNC( SYSDATE, 'IW' ) + LEVEL - 1,
         'FMDay',
         'NLS_LANGUAGE=ENGLISH'
       ),
       CASE
       WHEN LEVEL <= 5
       THEN 'Weekday'
       ELSE 'Weekend'
       END
FROM   DUAL
CONNECT BY LEVEL <= 7;

CREATE TABLE SCHEDULES ( Schedule_ID, Schedule, Other ) AS
SELECT 1, 'Weekend', 'ABC' FROM DUAL UNION ALL
SELECT 2, 'Weekday', 'DEF' FROM DUAL;

Запрос 1 :

SELECT s.*,
       d.days
FROM   schedules s
       INNER JOIN
       ( SELECT schedule,
                LISTAGG( day_name, ', ' )
                  WITHIN GROUP ( ORDER BY day_order ) AS days
         FROM   days
         GROUP BY schedule ) d
       ON ( s.schedule = d.schedule )

Результаты

| SCHEDULE_ID | SCHEDULE | OTHER |                                         DAYS |
|-------------|----------|-------|----------------------------------------------|
|           2 |  Weekday |   DEF | Monday, Tuesday, Wednesday, Thursday, Friday |
|           1 |  Weekend |   ABC |                             Saturday, Sunday |
...