在oracle SELECT的WHERE子句中比较列与自身

时间:2010-06-29 07:54:50

标签: sql database oracle sql-tuning

我有一个多表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??

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

提前致谢。

3 个答案:

答案 0 :(得分:10)

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

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

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

<击>


根据Jeffrey的评论

进行更新

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

答案 1 :(得分:0)

在您了解其影响之前,请删除它们。如果正如其他人指出的那样,它们对查询没有影响并且可能已经过优化,将它们留在那里没有任何害处,但可能在删除它们时会受到伤害。

在你确定没有破坏其他东西之前,不要试图修复一些有效的东西。

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

where id = id

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

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

好吧,想象一下,当用户在id字段上进行临时查询时数据库速度降低到以前速度的一小部分时,我们会惊讶于下一次迭代: - )

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

所以,我并不是说你不能做到这一点,只是建议理解为什么它首先放在一起是个好主意。

答案 2 :(得分: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!