2013-10-04 2 views
1

Это может быть простой, но мне нужно применить логику в другом:Oracle проходит внешнее значение запроса для внутреннего запроса

WITH t(col) AS (
SELECT 1 FROM dual 
UNION SELECT 2 FROM dual 
UNION SELECT 3 FROM dual 
UNION SELECT 4 FROM dual 
UNION SELECT 5 FROM dual 
) 
SELECT col , --- will works as usual 
(SELECT col FROM t WHERE col = outer_q.col) new_col, --working as well 
(
SELECT sum (latest_col) 
from 
(
SELECT col latest_col FROM t WHERE col = outer_q.col 
UNION ALL 
SELECT col FROM t WHERE col = outer_q.col 
) 
)newest_col -- need to get an output "4" 
from t outer_q where col = 2; 

простой выход, как:

 COL NEW_COL NEWEST_COL 
---------- ---------- ---------- 
     2   2   4 

Мне просто нужно использовать наружное самое значение, внутренний я использовал для третьей колонки

РЕДАКТИРОВАНИЯ - образца с более данными:

WITH 
t(col) AS 
    (SELECT 1 FROM dual 
    UNION 
    SELECT 2 FROM dual 
    UNION 
    SELECT 3 FROM dual 
    UNION 
    SELECT 4 FROM dual 
    UNION 
    SELECT 5 FROM dual 
    ), 
t1(amount, col) AS 
    (SELECT 100 , 2 FROM dual 
    UNION 
    SELECT 200, 3 FROM dual 
    ) 
SELECT col, 
    (SELECT col FROM t WHERE col = outer_q.col 
    ) new_col, 
    (SELECT SUM(x) 
    FROM 
      (SELECT col x FROM t 
      UNION ALL 
      SELECT amount x FROM t1 
     ) 
    WHERE col = outer_q.col 
    ) newest_col -- gives 315 as it takes whole `SUM` 
FROM t outer_q 
WHERE col = 2; 

Выход ожидается, как:

 COL NEW_COL NEWEST_COL 
---------- ---------- ---------- 
     2   2  102 

Заранее спасибо за любую помощь.

+1

: Кажется, странно, я не могу понять, почему вы делают союз во внутренней части, и вы знаете, что сумма 2 и 2 равна 4, не понимают дела за этим :( –

+0

ха-ха. не смотрите эту сумму или образец таблицы, но посмотрите на заголовок , Мне просто нужно передать только внешнее значение запроса во внутреннее. Надеюсь, его ясно. – ajmalmhd04

+0

Обновлен вопрос. – ajmalmhd04

ответ

2

Ну, вы можете, если вы отрефакторите но ваш запрос:

WITH t(col) AS (
    SELECT 1 FROM dual 
    UNION SELECT 2 FROM dual 
    UNION SELECT 3 FROM dual 
    UNION SELECT 4 FROM dual 
    UNION SELECT 5 FROM dual 
) 
SELECT col, 
     (SELECT col FROM t WHERE col = outer_q.col) new_col, 
     (SELECT sum (latest_col) 
     from 
     (
      SELECT col latest_col FROM t 
      UNION ALL 
      SELECT col FROM t 
     ) x 
     where x.latest_col = outer_q.col 
     ) newest_col -- need to get an output "4" 
from t outer_q where col = 2; 

Это возможно здесь, потому что outer_q теперь в предложении о where подзапрос. Он использовался ранее в суб-подзапросе (тот, который был с UNION ALL), и этот его скрывал.

Чтобы попытаться прояснить ситуацию, теперь у нас есть что-то вроде:

with t as (...) 
select col, 
     (SELECT col FROM t WHERE col = outer_q.col) new_col, 
     (SELECT col FROM (Something more complex) WHERE ... = outer_q.col) new_col, 
from t outer_q where col = 2; 

Таким образом, мы теперь имеют один и тот же уровень «внутренность».

EDIT: ответить на обновленный вопрос, есть немного адаптации необходимо:

WITH t(col) AS 
(
    SELECT 1 FROM dual 
    UNION 
    SELECT 2 FROM dual 
    UNION 
    SELECT 3 FROM dual 
    UNION 
    SELECT 4 FROM dual 
    UNION 
    SELECT 5 FROM dual 
), 
t1(amount, col) AS 
(
    SELECT 100, 2 FROM dual 
    UNION 
    SELECT 200, 3 FROM dual 
) 
SELECT col, 
    (SELECT col FROM t WHERE col = outer_q.col) new_col, 
    (SELECT SUM(amount) 
     FROM 
      (SELECT col, col amount FROM t -- row is (1, 1), then (2, 2) etc 
      UNION ALL 
      SELECT col, amount FROM t1  -- row is (2, 100), then (3, 200) etc 
     ) 
     WHERE col = outer_q.col 
    ) newest_col -- gives 102 as it takes whole `SUM` 
FROM t outer_q 
WHERE col = 2; 

Часть понять, в самом внутреннем запросе вы хотите суммировать как столбец и значение суммы, поэтому вы повторяете значение col, как если бы это была сумма.

Другой способ получить тот же результат (с большей производительностью, я думаю) будет подводить col и amount на той же строке:

WITH t(col) AS 
(
    SELECT 1 FROM dual 
    UNION 
    SELECT 2 FROM dual 
    UNION 
    SELECT 3 FROM dual 
    UNION 
    SELECT 4 FROM dual 
    UNION 
    SELECT 5 FROM dual 
), 
t1(amount, col) AS 
(
    SELECT 100, 2 FROM dual 
    UNION 
    SELECT 200, 3 FROM dual 
) 
SELECT col, 
    (SELECT col FROM t WHERE col = outer_q.col) new_col, 
    (SELECT SUM(all_amount) 
     FROM 
      (SELECT col, col + amount all_amount FROM t1) 
     WHERE col = outer_q.col 
    ) newest_col -- gives 315 as it takes whole `SUM` 
FROM t outer_q 
WHERE col = 2; 
+0

Спасибо за ответ, и для вышеприведенного образца вы прекрасны, я обновил вопрос для некоторых более подробные данные, пожалуйста, проверьте – ajmalmhd04

Смежные вопросы