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

cct*_*k11 3 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??
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

Vin*_*rat 10

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

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

  AND t1.col1 IS NOT NULL
  AND t2.col1 IS NOT NULL
Run Code Online (Sandbox Code Playgroud)


根据Jeffrey的评论更新

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

  • 为什么?第一个`t1.col1 = t2.col1`已经暗示它们不是NULL,所以`tx.col1 IS NOT NULL`是多余的. (3认同)