Sql Oracle将外部查询值传递给内部查询
这可能是一个简单的方法,但我需要在其他方面应用逻辑:Sql Oracle将外部查询值传递给内部查询,sql,oracle,Sql,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
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
提前感谢您的帮助。内部查询失败,因为您试图将外部的q.col引用向下推两个级别。相关查询只向下一级
Reference:内部查询失败,因为您试图将外部列引用向下推两级。相关查询只向下一级
参考资料:好吧,如果您重构了一个查询,那么您可以:
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\u 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;
所以我们现在有了同样的“内部性”
编辑:要回答更新后的问题,需要进行一些调整:
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;
如果重构一个查询,那么您可以:
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\u 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;
所以我们现在有了同样的“内部性”
编辑:要回答更新后的问题,需要进行一些调整:
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;
当前位置wierd,我无法理解,为什么你要在内部进行联合,并且你知道2和2的总和是4,不理解这背后的原因:(哈哈,不要看那个求和部分或示例表,但看标题,我只需要将最外层的查询值传递给内层。希望问题更清楚。:看来维德,我不明白,为什么你要在内层做一个并集,你知道2和2的和是4,不明白这背后的业务:(哈哈。不要看那个求和部分或示例表,但看标题,我只需要将最外层的查询值传递给最内层。希望它清楚地更新了问题。谢谢你的回答,对于上面的示例,你很完美,我已经更新了问题以获得更多的示例数据,请检查谢谢你的回答,以及上面的示例e、 你很完美,我已经更新了问题以获取更多样本数据,请检查