WITH
a (v)
AS
( SELECT LEVEL
FROM DUAL
CONNECT BY LEVEL < 5),
b (v)
AS
( SELECT LEVEL
FROM DUAL
CONNECT BY LEVEL < 5)
SELECT a.v
FROM a
CROSS APPLY (SELECT MIN (b.v)
FROM b
WHERE a.v = b.v) bb
結果 1,2,3,4 但預期結果將是 1,1,1,1。
代碼
uj5u.com熱心網友回復:
1,2,3,4是正確的輸出。
在外部查詢中,您將從SELECT a.v具有由.va CROSS JOINCROSS APPLY
bb對于您的代碼,子查詢中的輸出是什么并不重要,CROSS APPLY因為您沒有從中輸出值,bb并且聚合強制輸出為單行。
如果要從bb子查詢中獲取值,請使用:
WITH a (v) AS (
SELECT LEVEL FROM DUAL CONNECT BY LEVEL < 5
),
b (v) AS (
SELECT LEVEL FROM DUAL CONNECT BY LEVEL < 5
)
SELECT a.v, bb.min_v
FROM a
CROSS APPLY (
SELECT MIN (b.v) As min_v
FROM b
WHERE a.v = b.v
) bb
然后輸出是:
五 MIN_V 1 1 2 2 3 3 4 4
如果你想要所有1s 那么SELECT值 frombb并b.v <= a.v用作過濾器:
WITH a (v) AS (
SELECT LEVEL FROM DUAL CONNECT BY LEVEL < 5
),
b (v) AS (
SELECT LEVEL FROM DUAL CONNECT BY LEVEL < 5
)
SELECT a.v, bb.min_v
FROM a
CROSS APPLY (
SELECT MIN (b.v) As min_v
FROM b
WHERE b.v <= a.v
) bb
輸出:
五 MIN_V 1 1 2 1 3 1 4 1
db<>在這里擺弄
uj5u.com熱心網友回復:
我想,一切都按預期進行。您的交叉應用是按行評估的。因此,當您推到 av=1 時,要評估的查詢是
從 b 中選擇最小值 (bv),其中 1= bv
然后你提供 av=2 并且要評估的查詢是
從 b 中選擇最小值 (bv),其中 2= bv
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/484723.html
上一篇:從Oracle中的時間戳截斷毫秒
