Sql 基于另一列中的值显示listagg值(第2部分)

Sql 基于另一列中的值显示listagg值(第2部分),sql,oracle,oracle-apex,Sql,Oracle,Oracle Apex,我之前在这里发布了一个类似的问题: 在那个问题中,我使用UPDATE来存储逗号分隔的列表 我得到了一个解决方案,但我意识到多亏了贡献者,这不是最好的方法 我正在使用Oracle APEX,需要在表中显示此数据 ID Schedule Days 001 Weekend Saturday, Sunday 我有三张桌子要用。为了简单起见,它们是日、日程和日日程 DAYS table Day_ID - PK Day_Order Day_Name Schedule (I adde

我之前在这里发布了一个类似的问题:

在那个问题中,我使用UPDATE来存储逗号分隔的列表

我得到了一个解决方案,但我意识到多亏了贡献者,这不是最好的方法

我正在使用Oracle APEX,需要在表中显示此数据

ID   Schedule     Days
001  Weekend      Saturday, Sunday
我有三张桌子要用。为了简单起见,它们是日、日程和日日程

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
我尝试了几种方法让Days列显示相应日期的列表,但似乎都不起作用。我的主要尝试是摆弄SELECT/CASE语句,但即使语法完全正确,它仍然不会显示任何内容

我无法在两个表之间创建FK,因为两个明细表列都不是唯一的

我不知道下一步要尝试什么,所以任何帮助或提示都将不胜感激

谢谢,


哈桑

我认为这就是你想要实现的目标(你不需要日程表中的
天数
列,因为你可以从天数表中计算出来):

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;
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 |

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;
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 |

从表格中发布一些示例数据,然后发布预期结果。非常感谢您的回答!你是对的,你的结果正是我想要达到的。不过,这在Oracle APEX中会起作用吗?此外,模式已经设置好。如果我只实现这个查询,理论上它会工作吗?您没有我无法使用的任何列。但是,由于查询中缺少IF/CASE语句,我有些犹豫。我可以看到,您已经在模式设置中定义了“Weekday”、“Weekend”关系。我想知道它将如何在APEX中运行。我实现了这个查询,它工作得非常好。非常感谢你!