我有两张桌子:
表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 :(得分:0)
我的解决方案尝试是:
SELECT *
FROM T1 LEFT JOIN T2
ON T1.Name = T2.Name
AND NOT (T2.StartHour >= T1.StartDate AND T2.StartHour < T2.EndDate)
然后抓住没有空的地方。
条件可以评估为真在T2的行中,对于T1行1,但是T1行2,3,4,......,它实际上是真的,所以我得到4个结果或者其他什么。或者它只是没有正确评估它,因为它不会查看T1中的所有行。
答案 1 :(得分:0)
对于table2与table1匹配的每个条目,您可以计算违反条件的次数以及是否违反条件甚至一次,您不希望输出中的条件。这是通过在下面的查询中使用SUM(CASE WHEN..)
来完成的。
SELECT T2.NAME, T2.STARTHOUR, T2.DATA
FROM
TABLE1 T1
INNER JOIN
TABLE2 T2
ON T1.NAME = T2.NAME
GROUP BY T2.NAME, T2.STARTHOUR, T2.DATA
HAVING SUM(CASE WHEN T2.STARTHOUR >= T1.STARTDATE AND T2.STARTHOUR < T1.STARTDATE THEN 1 ELSE 0 END) = 0;
根据排除规则和包含规则,如果table2的starthour
与table1的enddate
相同,则可以看到规则未被违反。
答案 2 :(得分:0)
您可以使用此查询。
SELECT DISTINCT T2.*
FROM Table2 T2
WHERE
NOT EXISTS (SELECT * FROM Table1 T1 WHERE
T1.Name = T2.Name
AND T2.StartHour > T1.StartDate
AND T2.StartHour < T1.EndDate )