问题:
我需要做一个返回 shift_id
哪里 day_of_week
是 IN (0,1,2,3,4)
以及 NOT IN (5,6)
,例如:
“查找轮班日为星期天到星期四(星期五到星期六不存在记录)的轮班”
数据库结构:
表 shifts
:
shift_id - int, primary key
... - other columns
表 shift_days
:
shift_day_id - int, primary key
shift_id - int, foreign key to shifts table
day_of_week - int, where 0 = Sunday, 1 = Monday,..., 6 - Saturday
... - more columns
前任。
如果班次是星期一到星期五,那么 shift_days
只有5张记录 day_of_week
从1到5
如果轮班时间是星期天到星期四,那么 shift_days
只有5张记录 day_of_week
从0到4
db小提琴:
db小提琴(原件)
db fiddle(实时更新答案)
p、 我提出了这个问题:
SELECT shift_id
FROM (
SELECT shift_id, STRING_AGG(day_of_week, ',') AS 'days_of_week'
FROM shift_days
GROUP BY shift_id
) AS sdw
WHERE sdw.days_of_week = '0,1,2,3,4'
但我不知道如何保证顺序升序为'0,1,2,3,4',我想看看是否有一个替代使用字符串\u agg的情况下,我想使用不同的sql方言。
p、 附言。
再次强调的是,任何与周(5,6)的第天匹配的班次都是错误的匹配,因为我想排除这些记录。我想包括(0,1,2,3,4)条记录,必须包含所有0-4条记录。
2条答案
按热度按时间uxh89sit1#
可以尝试以下查询:
如果你想让所有的班次
day_of_week 5,6
```SELECT DISTINCT shift_id
FROM shift_days S
WHERE NOT EXISTS (SELECT 1 FROM shift_days T WHERE T.shift_id=S.shift_id AND
T.day_of_week in (5, 6))
如需参考,请单击此处进行演示
zvms9eto2#