就像标题所说,如果有人有我想知道的答案。我一直在谷歌搜索,但找不到一个直接的答案。
示例:
这有效
SELECT COUNT(*) FROM Table1 TB1, Table2 TB2
WHERE TB1.Field1 = TB2.Table2
这似乎需要数小时
SELECT COUNT(*) FROM Table1 TB1, Table2 TB2
WHERE TB1.Field1 <> TB2.Table2
答案 0 :(得分:12)
因为它们是不同的SQL句子。在第一个中,您使用Field1
和Table2
字段加入两个表。可能会返回一些记录。
在第二个中,您的查询可能会返回大量记录,因为您正在进行交叉连接,并且很多行将满足您的Field1 <> Table2
条件。
一个非常简化的例子
表1
Field1
------
1
2
5
9
表2
Table2
------
3
4
5
6
9
Query1将返回2,因为只有5和9是常见的。
Query2将返回18,因为交叉连接中的很多行都会计算。
如果您的表中包含大量记录,则需要一段时间来处理您的第二个查询。
答案 1 :(得分:11)
重要的是要认识到SQL是一种声明性语言而不是命令式语言。您描述了您希望数据适合的条件,而不是应该如何执行这些比较。数据库的工作是找到给你答案的最快方法(由query optimizer接管的任务)。这意味着查询中看似微小的变化可能会导致完全不同的查询计划,从而导致运行时行为大不相同。
=
比较可以转换为和优化的方式与两个字段上的简单连接相同。这意味着可以使用普通索引非常快速地执行查询,可能不会读取实际数据而只使用索引。
另一方面,<>
比较需要计算并检查条件的完整cartesian product,通常(可能有一种方法可以使用正确的索引对其进行优化,但通常是索引在这里没有帮助)。它通常也会返回更多结果,这会增加执行时间。
答案 2 :(得分:1)
可能第二个查询处理方式比第一个更多的行。
答案 3 :(得分:1)
(回想similar question)
您是否尝试计算Table1
中Table2
没有匹配记录的SELECT COUNT(*) FROM Table1 TB1
WHERE NOT EXISTS
(SELECT * FROM Table2 TB2
WHERE TB1.Field1 = TB2.Field2 )
行?
如果是这样,你可以使用这个
SELECT COUNT(*)
FROM
(
SELECT Field1 FROM Table1
MINUS
SELECT Field2 FROM Table2
) T
或者这个例如
{{1}}