假设我有三个表: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
好的,以您的具体示例为基础,我想出了一个与其他发布的解决方案不同的解决方案(尽管我认为我更喜欢您的解决方案)。已在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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。