【发布时间】:2019-03-03 02:35:42
【问题描述】:
我使用的是 Oracle 12。我设计了一个简单的示例来尝试传达我面临的问题,因为实际查询过于复杂,无法在此处展示。这个简单的示例包含与复杂查询相同的条件和逻辑。我希望找到一种方法,让位于主 SELECT 内的 WHEN 中的子查询访问从与主 SELECT 处于同一级别的内部连接定义的表别名。我试过这个版本,但它失败了'o'“表或视图不存在”:
SELECT emp.employeeid, emp.firstname
CASE
WHEN (SELECT count(*) FROM o WHERE o.shipperid <= 15) > 20 THEN 'Yes'
WHEN (SELECT count(*) FROM o WHERE o.shipperid <= 15) > 10 THEN 'Almost'
ELSE 'No'
END AS "Quota Met"
FROM Employee emp
INNER JOIN
(SELECT employeeid, shipperid FROM Orders
WHERE orderdate > sysdate - 30) o
ON o.employeeid = emp.id
WHERE emp.zipcode = 22151;
无法让上面的 INNER JOIN 版本正常工作,到目前为止,我最好的解决方法是使用如下所示的 WITH 功能定义 SELECT,但在实际查询中, WITH 块需要几分钟才能完成,因为没有办法限制它与 Employee.employeeid 匹配,就像上面的 INNER JOIN 版本尝试一样。
WITH MyOrders AS
(SELECT employeeid, shipperid FROM Orders
WHERE orderdate > sysdate - 30
)
SELECT emp.id, emp.name, o
CASE
WHEN (SELECT COUNT(*) FROM MyOrders o WHERE o.shipperid <= 15) > 20 THEN 'Yes'
WHEN (SELECT COUNT(*) FROM MyOrders o WHERE o.shipperid <= 15) > 10 THEN 'Almost'
ELSE 'No'
END AS "Quota Met"
FROM Employee emp
WHERE emp.zipcode = 22151;
WITH 版本真的是最好的解决方案吗?有什么办法可以重写第一个INNER JOIN版本,让CASE WHEN中的子查询可以访问连接的表别名?
【问题讨论】:
-
更新您的问题添加适当的数据样本和预期结果