这两个SQL语句是否总是在Oracle中返回相同的数据?

时间:2015-07-27 21:05:37

标签: sql oracle

我希望删除查询中的NVL函数,因为没有它,查询运行得更快。我确信在我的执行计划中可能会有更好的事情,但这似乎是更好的sql,可以产生相同的结果。更大的查询更复杂,但这基本上是我想要更新where子句的方式。这是一个很好的替代品吗?如果没有,为什么不呢,什么会更好?

当前SQL(使用NVL):

SELECT  *
FROM oe_order_lines_all ol  
WHERE  NVL(OL.LINK_TO_LINE_ID, OL.LINE_ID) = OL.LINE_ID 

替换SQL:

SELECT  *
FROM oe_order_lines_all ol
WHERE (OL.LINK_TO_LINE_ID IS NULL OR OL.LINK_TO_LINE_ID = OL.LINE_ID) 

2 个答案:

答案 0 :(得分:4)

是的,这两个查询在功能上是等价的,只要OL.LINE_ID本身永远不会为NULL,这可能是一个很好的假设......

这样打破它来证明它:

SELECT  *
FROM oe_order_lines_all ol  
WHERE  NVL(OL.LINK_TO_LINE_ID, OL.LINE_ID) = OL.LINE_ID 

相同
SELECT  *
FROM oe_order_lines_all ol  
WHERE  OL.LINK_TO_LINE_ID = OL.LINE_ID
OR     OL.LINK_TO_LINE_ID IS NULL AND OL.LINE_ID  = OL.LINE_ID 

但由于当OL.LINE_ID不为NULL时OL.LINE_ID = OL.LINE_ID,这简化了第二个查询:

SELECT  *
FROM oe_order_lines_all ol  
WHERE  OL.LINK_TO_LINE_ID = OL.LINE_ID
OR     OL.LINK_TO_LINE_ID IS NULL

当然,如果OL.LINK_TO_LINE_ID为NULL时OL.LINE_ID为NULL,则OL.LINE_ID不等于OL.LINE_ID,您可能会有不同的结果。

答案 1 :(得分:1)

非答案答案:在两者上都做EXPLAIN PLAN

答案是:是的,它们是等同的。如果link_to_line_id为空,则将line_id与其自身进行比较,这始终为真。

但是,不要试图进一步扩展模式。它适用于这种特定情况,因为它用于过滤表中的结果。如果你将它作为来自不同表格的列的连接标准使用它,它将会失败。