Получить несколько столбцов из большого подзапроса
Я видел несколько сообщений о получении столбцов из подзапросов, большинство из них предлагают использовать один выбор для каждого столбца, но это мой случай
SELECT CAST(p.idvendor AS VARCHAR(10)), CAST(p.description AS VARCHAR(50)),
(SELECT CAST(NVL(SUM(CASE WHEN locals_sales.cantidad >=0
AND locals_sales.cantidad <locals_sales.pqlocals
THEN 1 ELSE 0 END), '0') AS VARCHAR(10))
FROM locals_sales, agents, vendors, locals, locals_sales, history
WHERE locals.idvendor = vendors.idvendor
AND locals_sales.IDlocals = locals.idlocals
AND agents.codagente=vendors.codagente
AND agents.idagent!=1
AND locals_sales.number_n_line = locals_sales.n_line
AND locals.estado=1
AND vendors.idvendor = p.idvendor
AND history.number_line(+) = locals_sales.n_line
AND history.date(+) >= to_date('4/9/2012 00:00', 'dd/mm/yy HH24:mi:ss')
) AS critic,
(SELECT CAST(NVL(SUM(CASE WHEN locals_sales.cantidad >=locals_sales.pqlocals
AND locals_sales.cantidad <locals_sales.media
THEN 1 ELSE 0 END), '0') AS VARCHAR(10))
FROM locals_sales, agents, vendors, locals, locals_sales, history
WHERE locals.idvendor = vendors.idvendor
AND locals_sales.IDlocals = locals.idlocals
AND agents.codagente=vendors.codagente
AND agents.idagent!=1
AND locals_sales.number_n_line = locals_sales.n_line
AND locals.estado=1
AND vendors.idvendor = p.idvendor
AND history.number_line(+) = locals_sales.n_line
AND history.date(+) >= to_date('4/9/2012 00:00', 'dd/mm/yy HH24:mi:ss')
) AS medium,
(SELECT CAST(NVL(SUM(CASE WHEN locals_sales.cantidad >=locals_sales.media
THEN 1 ELSE 0 END), '0') AS VARCHAR(10))
FROM locals_sales, agents, vendors, locals, locals_sales, history
WHERE locals.idvendor = vendors.idvendor
AND locals_sales.IDlocals = locals.idlocals
AND agents.codagente=vendors.codagente
AND agents.idagent!=1
AND locals_sales.number_n_line = locals_sales.n_line
AND locals.estado=1
AND vendors.idvendor = p.idvendor
AND history.number_line(+) = locals_sales.n_line
AND history.date(+) >= to_date('4/9/2012 00:00', 'dd/mm/yy HH24:mi:ss')
) AS NORMAL
FROM vendors p, agents ag
WHERE ag.codagente=p.codagente
Как вы видите, у меня есть три СУММЫ для каждого столбца, эти столбцы взяты из одних и тех же таблиц, разница заключается в моих предварительных условиях в каждом случае каждого выбора
Кроме того, почти в конце каждого выбора у меня есть это как условие
vendors.idvendor = p.idvendor
p - псевдоним таблицы вне подзапроса.
Как я могу избежать использования трех вариантов выбора почти одинаково и использовать вместо этого один выбор для 3 столбцов, чтобы повысить производительность?
1 ответ
Вы можете справиться с этим, переместив подзапросы в предложение FROM и выполнив правильное соединение.
Окончательный запрос будет выглядеть так:
select CAST(p.idvendor AS VARCHAR(10)), CAST(p.description AS VARCHAR(50)),
s.val1, s.val2, sl.val3
from vendors p join
agents ag
on p.codeagent = ag.codeagent join
(<a variation of your subquery here with all three columns defined and idvendor in the select list>
) s
on p.idvendors= s.idvendor
Кроме того, чтобы сделать ваши запросы более читабельными, вы должны действительно использовать правильный синтаксис объединения.