3

我有一个多表 SELECT 查询,它将列值与自身进行比较,如下所示:

SELECT * FROM table1 t1,table2 t2
      WHERE t1.col1=t2.col1  --Different tables,So OK.
      AND t1.col1=t1.col1    --Same tables??
      AND t2.col1=t2.col1    --Same tables??

这对我来说似乎是多余的。我的问题是,删除它们会对逻辑/性能产生任何影响吗?

提前致谢。

4

3 回答 3

10

这似乎是多余的,它唯一的作用是删除这些列中具有 NULL 值的行。在删除这些子句之前,请确保列不为空。

如果这些列可以为空,您可以安全地将这些行替换为(更易于阅读、更易于维护):

  AND t1.col1 IS NOT NULL
  AND t2.col1 IS NOT NULL


在杰弗里的评论之后更新

你是绝对正确的,我不知道我自己怎么没有看到它:连接条件t1.col1=t2.col1意味着只有连接列不为空的行才会被考虑。因此,这些条款tx.col1=tx.col1是完全多余的,可以安全地删除。

于 2010-06-29T08:02:37.760 回答
0

在您了解影响之前不要删除它们。如果正如其他人指出的那样,它们对查询没有影响并且可能已被优化,那么将它们留在那里没有害处,但删除它们可能会有害处。

在你确定你没有破坏其他东西之前,不要试图修复正在工作的东西。

我之所以提到这一点是因为我们继承了一个具有这种结构的遗留报告应用程序,大致如下:

where id = id

而且,作为一个明智的人,我放弃了它,只是发现数据库引擎并不是唯一使用查询的东西。

它首先通过预处理器提取where子句中存在的每一列并确保它们被索引。基本上是一个自动调整数据库。

好吧,想象一下我们对下一次迭代的惊讶,当用户在现场进行临时查询时,数据库速度减慢到以前的一小部分id:-)

事实证明,这是以前的支持团队为了确保常见的即席查询也使用索引列而加入的,即使我们的标准查询都没有这样做。

所以,我并不是说你不能这样做,只是建议理解为什么它被放在第一位可能是一个好主意。

于 2010-06-29T08:19:51.743 回答
0
  1. 是的,条件显然是多余的,因为它们是相同的!

    SELECT * FROM table1 t1,table2 t2
    WHERE t1.col1=t2.col1
    
  2. 但你至少需要其中之一。否则,您将拥有笛卡尔连接:table1 中的每一行都将连接到 table2 中的每一行。如果 table1 有 100 行,table2 有 1,000 行,则结果查询将返回 100,000 个结果。

    SELECT * FROM table1 t1,table2 t2 --warning!
    
于 2010-06-29T12:02:15.327 回答