oracle中给表起别名不能用as,用as报错
在 Oracle 数据库中,WITH 子句(即 CTE,公共表表达式)允许后续定义的子查询引用前面已经定义的 CTE,但 前面的 CTE 无法引用后面的 CTE。这种设计类似于“顺序依赖”,后面的 CTE 可以基于前面的结果进行查询。
WITH
-- 第一个 CTE,定义基础数据
cte1 AS (
SELECT sbid, bcjyrq, xcjyrq
FROM sbjcpg_hysb_jyxx
),
-- 第二个 CTE,引用 cte1
cte2 AS (
SELECT sbid, MAX(xcjyrq) AS latest_xcjyrq
FROM cte1 -- ✅ 合法:引用前面的 cte1
GROUP 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 子句)
SELECT
COUNT(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 rn
FROM sbjcpg_hysb_jyxx
) -- 内联子查询替代 WITH
WHERE rn = 1
) b; -- Oracle 表别名禁止用 AS
起别名不要加双引号