Sql 基于另一列中的值显示listagg值(第2部分)
我之前在这里发布了一个类似的问题: 在那个问题中,我使用UPDATE来存储逗号分隔的列表 我得到了一个解决方案,但我意识到多亏了贡献者,这不是最好的方法 我正在使用Oracle APEX,需要在表中显示此数据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
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中运行。我实现了这个查询,它工作得非常好。非常感谢你!