我有两张桌子:
表1:
Name, StartDate, EndDate
前:
Timmy, 9/12/17 08:00:00, 9/13/17 00:00:00
Timmy, 9/13/17 05:00:00, 9/13/17 07:00:00
表2:
Name, StartHour, Data...
前:
Timmy, 9/13/17 06:00:00, Data1...
Timmy, 9/13/17 04:00:00, Data2...
Timmy, 9/13/17 07:00:00, Data3...
Timmy, 9/12/17 14:00:00, Data4...
因此,我需要获得表2中的每条记录,其中起始小时不在表1中的日期范围内。这需要针对每个名称进行(因此T1 / T2中可以有多个匹配的名称)看T2的数据列是不同的。它应该包含在左侧,不包括在右侧。
所以对于这个查询,我想看看
Timmy, 9/13/17 04:00:00, Data2...
Timmy, 9/13/17 07:00:00, Data3... (Inclusive on end date)
我不介意它是否加入;我可以删除额外的列。我不想看到重复。我还会遇到问题,我会检查是否(StartHour> = StartDate AND StartHour< EndDate)。因此,需要针对表1中具有匹配名称的每一行检查表2中的每一行/ startHour。我无法处理;我认为它需要一个子查询,但我不知道。
检查它是否在范围内,但是否定因为我不想要它们,如果它们在范围内(包括,不包括)。
答案 0 :(得分:1)
鉴于以下表格:
CREATE TABLE #table1 ([Name] VARCHAR(15), startdate DATETIME, enddate DATETIME)
CREATE TABLE #table2 ([Name] VARCHAR(15), starthour DATETIME, [data] VARCHAR(MAX))
INSERT INTO #table1 (Name, startdate, enddate)
VALUES ('Timmy','9/12/17 08:00:00','9/13/17 00:00:00'),
('Timmy','9/13/17 05:00:00','9/13/17 07:00:00')
INSERT INTO #table2 (Name, starthour, data)
VALUES ('Timmy','9/13/17 06:00:00','Data1...'),
('Timmy','9/13/17 04:00:00','Data2...'),
('Timmy','9/13/17 07:00:00','Data3...'),
('Timmy','9/12/17 14:00:00','Data4...')
以下查询似乎适用于您想要的内容:
SELECT t2.name, t2.starthour, t2.[data]
FROM #table2 t2
INNER JOIN #table1 t1 ON t1.name = t2.name
WHERE t2.starthour BETWEEN t1.startdate AND t1.enddate
结果:
[name] [starthour] [Data]
----------------------------------------
Timmy 2017-09-13 06:00:00.000 Data1...
Timmy 2017-09-13 07:00:00.000 Data3...
Timmy 2017-09-12 14:00:00.000 Data4...
答案 1 :(得分:0)
如上所述,NOT EXISTS
可能就是这里的方式。 NOT IN
是另一种选择。我们的想法是您将查询基于表2,然后使用针对表1的NOT EXISTS过滤WHERE子句中的输出。
例如:
SELECT
t2.Name,
t2.StartHour
FROM #Table2 t2
WHERE NOT EXISTS (
SELECT 1
FROM #Table1 t1
WHERE t1.Name = t2.Name
AND t1.StartDate <= t2.StartHour
AND t2.EndDate > t2.StartHour
);
有关EXISTS的更多信息,以及EXISTS和IN之间的比较: