如何查询在一个匹配项中存在但在另一个匹配项中不存在的组字段

问题描述 投票:-1回答:2

问题:

我需要进行SELECT查询以返回shift_id,其中day_of_weekIN (0,1,2,3,4)NOT IN (5,6),如:

“查找班次,其中班次为周日至周四(并且周五至周六没有记录)”

数据库结构:

shifts

shift_id-整数,主键...-其他栏

shift_days

shift_day_id-整数,主键shift_id-int,移位表的外键day_of_week-int,其中0 =星期日,1 =星期一,...,6-星期六...-更多专栏

Ex。

  • 如果班次是星期一至星期五,那么shift_days只有5条记录,day_of_week从1到5
  • 如果班次是星期日-星期四,则shift_days只有5条记录,day_of_week从0到4

DB Fiddle setup

P.S。我能够提出这个查询:

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',我想看看是否有替代方法使用STRING_AGG,以防我想用于其他SQL。方言。

P.P.S。

再次强调,任何匹配day_of_week(5,6)的班次都是错误的匹配,因为我想排除这些记录。

sql sql-server grouping sql-server-2017
2个回答
0
投票
group by shift_id
having count(case when day_of_week in (5, 6) then 1 end) = 0

0
投票

可以尝试以下查询:

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))
© www.soinside.com 2019 - 2024. All rights reserved.