我之前在此发布了一个类似的问题:Displaying LISTAGG values in a cell based on the value of another column。
在那个问题中,我使用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
我已经尝试了几种方法让Days列显示相应日期的列表,但似乎都没有。我的主要尝试是摆弄SELECT / CASE语句,但即使语法完全正确,它仍然不会显示任何内容。
我无法在两个表之间创建FK,因为Schedules列都不是唯一的。
我不确定接下来要尝试什么,所以感谢任何帮助或提示!
谢谢,
哈桑
答案 0 :(得分:0)
我认为这是您要实现的目标(您不需要在计划表中使用DAYS
列,因为您可以从days表中计算它):
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 )
<强> Results 强>:
| SCHEDULE_ID | SCHEDULE | OTHER | DAYS |
|-------------|----------|-------|----------------------------------------------|
| 2 | Weekday | DEF | Monday, Tuesday, Wednesday, Thursday, Friday |
| 1 | Weekend | ABC | Saturday, Sunday |