我有一个多桌选择查询,该查询将列值与本身进行比较如下:

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??

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

提前致谢。

有帮助吗?

解决方案

这似乎是多余的,其唯一的效果是删除这些列中具有无效值的线路。在删除这些子句之前,请确保列不是零。

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

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


杰弗里的评论后更新

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

其他提示

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

不要尝试修复有效的东西,直到您该死的东西不会破坏其他东西。

我提到这一点的原因是因为我们继承了一个旧的报告应用程序,该应用程序完全具有以下方式:

where id = id

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

它首先经过了一个前处理器,该处理器提取了在 where 条款并确保他们被索引。基本上是自动调整数据库。

好吧,想象一下,当数据库在用户在临时查询上进行临时查询时,数据库放慢了以前的速度的一小部分时,我们就会感到惊讶 id 场地 :-)

事实证明,这是以前的支持团队提出的一个kludge,以确保常见的临时查询也使用索引列,即使我们的标准查询都没有。

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

  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!
    
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top