我在 oracle live SQL 中運行了以下代碼,但它給出了錯誤。問題是什么?
select * from bricks full join
((select count(*) from bricks) as "counts"
inner join (select count(*) from bricks group by colour) as "colours"
on counts.colour=colours.colour)
on bricks.colour=bricks.colour; --a dummy condition just for connecting tables without a specific column
輸出:
ORA-00907: missing right parenthesis
uj5u.com熱心網友回復:
問題是:
AS在表/子查詢別名是 Oracle 中的無效語法之前。洗掉AS關鍵字。- 您使用的別名是區分大小寫的帶引號的識別符號,并且在參考別名時不要使用具有相同大小寫的帶引號的識別符號。洗掉雙引號。
- or子查詢在子句中都
counts沒有列,并且您不能隨后在連接條件的子句中參考不存在的列。colourscolourSELECTON
您可以使用以下方法修復它:
select *
from bricks
CROSS JOIN (select count(*) AS cnt from bricks) counts
LEFT OUTER JOIN (
select colour, count(*) AS colour_cnt
from bricks
group by colour
) colours
on bricks.colour=colours.colour
其中,對于樣本資料:
CREATE TABLE bricks (id, colour) AS
SELECT 1, 'red' FROM DUAL UNION ALL
SELECT 2, 'red' FROM DUAL UNION ALL
SELECT 3, 'red' FROM DUAL UNION ALL
SELECT 4, 'green' FROM DUAL UNION ALL
SELECT 5, 'green' FROM DUAL UNION ALL
SELECT 6, 'blue' FROM DUAL;
輸出:
ID 顏色 碳納米管 顏色 COLOUR_CNT 1 紅色的 6 紅色的 3 2 紅色的 6 紅色的 3 3 紅色的 6 紅色的 3 4 綠色 6 綠色 2 5 綠色 6 綠色 2 6 藍色 6 藍色 1
但是,您可能希望簡化事情并使用分析COUNT() OVER (...)函式并消除自聯接:
select b.*,
COUNT(*) OVER () AS cnt,
COUNT(*) OVER (PARTITION BY colour) AS colour_cnt
from bricks b;
哪個輸出:
ID 顏色 碳納米管 COLOUR_CNT 6 藍色 6 1 5 綠色 6 2 4 綠色 6 2 2 紅色的 6 3 1 紅色的 6 3 3 紅色的 6 3
(除了不復制顏色列之外相同)
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/442071.html
上一篇:透視混合資料
下一篇:從子表中獲取所有1:n記錄
