【问题标题】:Correlated vs Non-correlated subqueries in SQLSQL 中的相关子查询与非相关子查询
【发布时间】:2014-03-25 02:26:19
【问题描述】:

我正在使用 SQL 中的相关子查询和非相关子查询,并且我试图通过这两种类型的查询获得相同的结果。我的问题与我的非相关子查询有关。查询运行但不返回任何结果。我的相关子查询确实返回结果,就像它应该的那样。我需要帮助来确定我的简单非相关子查询是否写错了。任何帮助是极大的赞赏。我的查询如下:

--不相关子查询

SELECT *
FROM hr.bc_products p
WHERE p.sku NOT IN (SELECT ol.sku FROM hr.bc_orderlines ol);

--相关子查询

SELECT * 
FROM hr.bc_products p
WHERE NOT EXISTS (SELECT ol.sku FROM hr.bc_orderlines ol WHERE ol.sku = p.sku);

【问题讨论】:

  • fwiw,我倾向于用排除连接来写这个:SELECT p.* FROM hr.bc_products p LEFT JOIN hr.bc_orderlines ol ON p.sku = ol.sku WHERE ol.sku IS NULL
  • 这是有道理的。让我试试看。

标签: sql subquery correlated-subquery


【解决方案1】:

我终于弄清楚了问题所在。查看每个查询的结果后,我意识到空值正在影响结果。我通过排除空值来更新我的非相关子查询。我更新的非相关子查询的工作原理如下:

--不相关子查询

SELECT *
FROM hr.bc_products p
WHERE p.sku NOT IN (SELECT ol.sku FROM hr.bc_orderlines ol WHERE ol.sku IS NOT NULL);

希望这将有助于某人在将来避免该问题。

【讨论】: