我有下表:
CREATE TABLE TEMP_TEST
(
CODE NUMBER,
DATE_COL NUMBER,
VAL NUMBER
);
值:
INSERT INTO TEMP_TEST (code, DATE_COL, val)
VALUES (1, 20210101, 1);
INSERT INTO TEMP_TEST (code, DATE_COL, val)
VALUES (1, 20210102, 1);
INSERT INTO TEMP_TEST (code, DATE_COL, val)
VALUES (1, 20210103, 1);
INSERT INTO TEMP_TEST (code, DATE_COL, val)
VALUES (2, 20210101, 1);
因此,我想在每個不同的DATE_COL行上獲取每個不同的CODE行:
CODE|DATE_COL|VAL|
---- -------- ---
1|20210101| 1|
1|20210102| 1|
1|20210103| 1|
2|20210101| 1|
2|20210102| 1| (new line)
2|20210103| 1| (new line)
這是每個日期的不同之處:
SELECT DATE_COL
FROM TEMP_TEST
GROUP BY DATE_COL
這是每個代碼的不同之處:
SELECT code
FROM TEMP_TEST
GROUP BY CODE
如何獲取每個代碼的每個日期,以便結果集具有上述兩個不同結果集的相乘大小?
uj5u.com熱心網友回復:
您可以使用PARTITIONed OUTER JOIN:
SELECT t.code,
d.date_col,
COALESCE(t.val, 1) AS val
FROM (
SELECT DISTINCT date_col FROM temp_test
) d
LEFT OUTER JOIN temp_test t
PARTITION BY (t.code)
ON (t.date_col = d.date_col);
其中,對于您的樣本資料,輸出:
代碼 DATE_COL 價值 1 20210101 1 1 20210102 1 1 20210103 1 2 20210101 1 2 20210102 1 2 20210103 1
db<>在這里擺弄
注意:當VAL值不相同時,這也適用,因為相關性保持在code,date_col和之間val。如果您天真地使用,CROSS JOIN則不會保持相關性,并且可能會生成額外的行。資料庫<>小提琴
uj5u.com熱心網友回復:
一個簡單的選擇是執行三重自交叉連接:
SQL> select distinct a.code, b.date_col, c.val
2 from temp_test a cross join temp_test b cross join temp_test c
3 order by 1, 2, 3;
CODE DATE_COL VAL
---------- ---------- ----------
1 20210101 1
1 20210102 1
1 20210103 1
2 20210101 1
2 20210102 1
2 20210103 1
6 rows selected.
SQL>
它會如何處理大桌子,這是另一個問題。如果它們不是那么大,我想應該沒問題。
uj5u.com熱心網友回復:
您可以在 DATE_COL 和 CODE 的不同值之間執行笛卡爾連接。不清楚你想從 VAL 列顯示什么,所以我不顯示它
select date_col_data.DATE_COL, code_data.code
from
(SELECT distinct DATE_COL
FROM TEMP_TEST ) date_col_data,
( SELECT distinct code
FROM TEMP_TEST ) code_data
db fiddle 這里https://dbfiddle.uk/?rdbms=oracle_18&fiddle=a9cf8afb7b5e1d652ddb5362066f0970
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/346925.html
上一篇:如何將權限表授予用戶帳戶?
下一篇:OracleAPEX自動化計劃
