?oracle中給表起別名不能用as,用as報錯
在 Oracle 數據庫中,??WITH 子句(即 CTE,公共表表達式)允許后續定義的子查詢引用前面已經定義的 CTE??,但 ??前面的 CTE 無法引用后面的 CTE??。這種設計類似于“順序依賴”,后面的 CTE 可以基于前面的結果進行查詢。
WITH-- 第一個 CTE,定義基礎數據cte1 AS (SELECT sbid, bcjyrq, xcjyrqFROM sbjcpg_hysb_jyxx),-- 第二個 CTE,引用 cte1cte2 AS (SELECT sbid, MAX(xcjyrq) AS latest_xcjyrqFROM cte1 -- ? 合法:引用前面的 cte1GROUP BY sbid)
-- 主查詢,聯合引用 cte1 和 cte2
SELECT a.sbid, a.bcjyrq, b.latest_xcjyrq
FROM cte1 a
JOIN cte2 b ON a.sbid = b.sbid;
?
?with? as相當于子查詢,就是把
SELECT a."在用狀態數量",a."停用狀態數量",a."注銷和報廢狀態數量",b."檢驗期內數量",b."超期未檢驗數量"
FROM (-- 設備狀態統計SELECT COUNT(CASE WHEN sbzt = 'SBZT_ZY' THEN 1 END) AS "在用狀態數量",COUNT(CASE WHEN sbzt = 'SBZT_TY' THEN 1 END) AS "停用狀態數量",COUNT(CASE WHEN sbzt NOT IN ('SBZT_ZY', 'SBZT_TY') OR sbzt IS NULL THEN 1 END) AS "注銷和報廢狀態數量"FROM sbjcpg_hysb_jcxx
) a -- Oracle 表別名禁止用 AS
CROSS JOIN (-- 檢驗狀態統計(移除了 WITH 子句)SELECTCOUNT(CASE WHEN xcjyrq > CURRENT_TIMESTAMP THEN 1 END) AS "檢驗期內數量",COUNT(CASE WHEN xcjyrq <= CURRENT_TIMESTAMP THEN 1 END) AS "超期未檢驗數量"FROM (SELECT sbid,xcjyrq,ROW_NUMBER() OVER (PARTITION BY sbid ORDER BY bcjyrq DESC, LRSJ DESC) AS rnFROM sbjcpg_hysb_jyxx) -- 內聯子查詢替代 WITHWHERE rn = 1
) b; -- Oracle 表別名禁止用 AS
?起別名不要加雙引號