开发者社区> 问答> 正文

根据优先级从不同的表返回值

假设我有三个表:TableA(键,值)TableB(键,值)TableC(键,值)

我想为所有键返回一个值。如果键存在于TableC中,则返回该值;否则,如果键存在于B中,则返回该值,否则返回表A中的值

到目前为止,我想出的最好的方法是

SELECT key,Value FROM TableA WHERE key NOT IN (SELECT key FROM TableB) AND key NOT IN (SELECT key FROM TableC) UNION SELECT key,Value FROM TableB WHERE key NOT IN (SELECT key FROM TableC) UNION SELECT key,Value FROM TableC 但这似乎是蛮力的。有人知道更好的方法吗?

编辑:这是一个更具体的示例。将TableA视为标准工作计划,其中的关键是日期,而值是指定的班次。表B是覆盖标准工作周的法定假日日历。表C是一个例外时间表,当有人被要求进来并进行额外的轮班或其他轮班时,该表将用于覆盖其他两个时间表。

问题来源于stack overflow

展开
收起
保持可爱mmm 2019-11-18 16:35:35 520 0
1 条回答
写回答
取消 提交回答
  • 好的,以您的具体示例为基础,我想出了一个与其他发布的解决方案不同的解决方案(尽管我认为我更喜欢您的解决方案)。已在MS SQL Server 2005上进行过测试-您的SQL方言可能需要更改。

    首先,一些DDL设置了阶段:

    CREATE TABLE [dbo].[StandardSchedule]( [scheduledate] [datetime] NOT NULL, [shift] varchar NOT NULL, CONSTRAINT [PK_StandardSchedule] PRIMARY KEY CLUSTERED ( [scheduledate] ASC ));

    CREATE TABLE [dbo].[HolidaySchedule]( [holidaydate] [datetime] NOT NULL, [shift] varchar NOT NULL, CONSTRAINT [PK_HolidaySchedule] PRIMARY KEY CLUSTERED ( [holidaydate] ASC ));

    CREATE TABLE [dbo].[ExceptionSchedule]( [exceptiondate] [datetime] NOT NULL, [shift] varchar NOT NULL, CONSTRAINT [PK_ExceptionDate] PRIMARY KEY CLUSTERED ( [exceptiondate] ASC ));

    INSERT INTO ExceptionSchedule VALUES ('2008.01.06', 'ExceptionShift1'); INSERT INTO ExceptionSchedule VALUES ('2008.01.08', 'ExceptionShift2'); INSERT INTO ExceptionSchedule VALUES ('2008.01.10', 'ExceptionShift3'); INSERT INTO HolidaySchedule VALUES ('2008.01.01', 'HolidayShift1'); INSERT INTO HolidaySchedule VALUES ('2008.01.06', 'HolidayShift2'); INSERT INTO HolidaySchedule VALUES ('2008.01.09', 'HolidayShift3'); INSERT INTO StandardSchedule VALUES ('2008.01.01', 'RegularShift1'); INSERT INTO StandardSchedule VALUES ('2008.01.02', 'RegularShift2'); INSERT INTO StandardSchedule VALUES ('2008.01.03', 'RegularShift3'); INSERT INTO StandardSchedule VALUES ('2008.01.04', 'RegularShift4'); INSERT INTO StandardSchedule VALUES ('2008.01.05', 'RegularShift5'); INSERT INTO StandardSchedule VALUES ('2008.01.07', 'RegularShift6'); INSERT INTO StandardSchedule VALUES ('2008.01.09', 'RegularShift7'); INSERT INTO StandardSchedule VALUES ('2008.01.10', 'RegularShift8'); 使用这些表/行作为基础,此SELECT语句检索所需的数据:

    SELECT DISTINCT COALESCE(e2.exceptiondate, e.exceptiondate, holidaydate, scheduledate) AS ShiftDate, COALESCE(e2.shift, e.shift, h.shift, s.shift) AS Shift FROM standardschedule s FULL OUTER JOIN holidayschedule h ON s.scheduledate = h.holidaydate FULL OUTER JOIN exceptionschedule e ON h.holidaydate = e.exceptiondate FULL OUTER JOIN exceptionschedule e2 ON s.scheduledate = e2.exceptiondate ORDER BY shiftdate

    2019-11-18 16:35:43
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载

相关实验场景

更多