如何更好地识别 SQL 中指定的开始和结束端点内的表冲突?

Posted

技术标签:

【中文标题】如何更好地识别 SQL 中指定的开始和结束端点内的表冲突?【英文标题】:How can I better identify table conflicts inside my specified start and end endpoints in SQL? 【发布时间】:2016-03-31 13:27:22 【问题描述】:

我有以下 SQL 语句来返回特定模块的行存在日期冲突的行:

SELECT e1.[id], e1.[start], e1.[end], e2.[id] AS Expr1, e2.[start] AS Expr2, e2.[end] AS Expr3
FROM ClassTimes AS e1 
INNER JOIN ClassTimes AS e2 ON e1.[id] < e2.[id]
WHERE (e1.[start] BETWEEN e2.[start] AND e2.[end])
AND (e1.[module] = @module) 
AND (e2.[module] = @module) 
OR  (e1.[module] = @module) 
AND (e2.[module] = @module) 
AND (e1.[end] BETWEEN e2.[start] AND e2.[end])

对于某些冲突,这很有效,例如我的数据库中将返回的以下行:

id| start            | end              | module                 
----------------------------------------------------
1 | 30/02/2016 10:00 | 30/02/2016 11:00 | 1
2 | 30/02/2016 10:30 | 30/02/2016 11:30 | 1

但我遇到的问题是,当我有一行的起始值是另一行的等效结束值时。我在下面显示了 30/02/2016 13:00 的值。

id| start            | end              | module                 
----------------------------------------------------
3 | 30/02/2016 12:00 | 30/02/2016 13:00 | 1
4 | 30/02/2016 13:00 | 30/02/2016 14:00 | 1

如何修改我的 sql 语句以消除返回这些端点的行?

【问题讨论】:

Join 条件似乎很奇怪。正如 jarlh 所说,在您的情况下,您的 OR 存在括号问题。 我一直在使用此处提供的解决方案:forums.devshed.com/mysql-help-4/… 【参考方案1】:

看看this。介于范围内的值包括在内。

使用“”来解决你的问题

【讨论】:

【参考方案2】:

我相信现在这对我有用:

WHERE (e1.[module] = @module) 
AND (e2.[module] = @module) 
AND (e1.[end] > e2.[start]) 
AND (e1.[end] <= e2.[end]) 
OR  (e1.[module] = @module) 
AND (e2.[module] = @module) 
AND (e1.[start] >= e2.[start]) 
AND (e1.[start] < e2.[end])

【讨论】:

【参考方案3】:

如果我理解它,您想获取同时包含 2 个模块的所有行。

SELECT e1.[id], e1.[start], e1.[end], e2.[id] AS Expr1, e2.[start] AS Expr2, e2.[end] AS Expr3
FROM ClassTimes AS e1 
INNER JOIN ClassTimes AS e2 ON e1.[module] = e2.[module] AND e1.[id] < e2.[id]
WHERE e1.[module] = @module AND ((e1.[start] BETWEEN e2.[start] AND e2.[end])
    OR  (e1.[end] BETWEEN e2.[start] AND e2.[end]))

【讨论】:

以上是关于如何更好地识别 SQL 中指定的开始和结束端点内的表冲突?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过java程序查询出来与数据库中指定的表相关联的表呢?

C++ 问题...定义不能识别声明中指定的向量

Intellij IDEA 无法识别 Maven 依赖项中指定的类

Intellij IDEA 无法识别 Maven 依赖项中指定的类

如果满足另一个中指定的条件,则更新查询在其中一个中更新数据

linux下如何提取日志中指定的一段内容?100分急求!!!