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
起别名不要加双引号