Я использую Oracle 12. Я придумал упрощенный пример, чтобы попытаться передать проблему, с которой я сталкиваюсь, поскольку фактический запрос слишком сложен, чтобы представлять его здесь.Этот упрощенный пример содержит те же условия и логику, что и сложный запрос.Я надеюсь найти способ для подзапроса, который находится в WHEN в основном SELECT, для доступа к псевдониму таблицы, который определен из внутреннего соединения, которое находится на том же уровне, что и основной 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, как показано ниже, но в реальном запросе блок 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;
Является ли эта версия СО действительно лучшим решением?Есть ли способ переписать первую версию INNER JOIN, чтобы подзапрос в CASE WHEN мог получить доступ к псевдониму объединенной таблицы?