CTE问题(带有..as结构)

时间:2019-07-31 23:07:57

标签: sql common-table-expression

我正在尝试通过在线练习来学习CTE构造。

这是查询的简化版本:

with mr as 
(
     select min(ram) 
     from pc
)
select model 
from pc 
where ram = mr 
  and speed = (select max(speed) from pc where ram = mr)

它失败并显示错误:

  

未为“ mr”的第1列指定列名

我试图通过在聚合列中添加别名来解决问题

with mr as 
(
    select min(ram) as v 
    from pc
) 
select model 
from pc 
where ram = mr.v 
  and speed = (select max(speed) from pc where ram = mr.v)

现在它失败并显示

  

无法绑定多部分标识符“ mr.v”

那么,为什么上述查询会产生错误,并且-编写此类查询的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

with mr as (select min(ram) minram from pc) select model from pc where ram=(select minram from mr) and speed=(select max(speed) from pc where ram = (select minram from mr)) 不是列,而是类似表格的查询,您必须这样引用它:

{{1}}

答案 1 :(得分:1)

如果您要查询较短的内容,则假设您要查询一行,然后使用order by和某种形式的限制:

select pc.*
from pc
order by ram desc, speed asc
fetch first 1 row only;

答案 2 :(得分:0)

解决此问题的另一种方法是将两个子查询都定义为CTE。

with mr as (select min(ram) min_ram from pc),
     ms as (select max(speed) as max_speed from pc where ram = (select minram from mr))

select pc.model 
from pc
    left join mr on pc.ram = mr.min_ram
    left join ms on pc.speed = ms.max_speed