Sql 与CTE一起发布(与..作为施工)

Sql 与CTE一起发布(与..作为施工),sql,common-table-expression,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 m

我试图通过在线练习学习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”


那么,为什么上面的查询会产生错误,以及——编写此类查询的正确方法是什么

mr
不是一列,而是一个类似于表的查询,您必须这样引用它:

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))

mr
不是一列,而是一个类似于表的查询,您必须这样引用它:

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))

如果需要较短的查询,则假设需要一行,然后使用
orderby
和某种形式的限制:

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

如果需要较短的查询,则假设需要一行,然后使用
orderby
和某种形式的限制:

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

解决这个问题的另一种方法是将两个子查询都定义为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

解决这个问题的另一种方法是将两个子查询都定义为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

是的,我明白了。那么在这种情况下,使用CTE并不会减少太多的冗长。我认为我们可以将聚合值放入变量中,然后重用它。您可以使用变量。但在这个简单的例子中,我不认为有太多的冗长。是的,我明白了。那么在这种情况下,使用CTE并不会减少太多的冗长。我认为我们可以将聚合值放入变量中,然后重用它。您可以使用变量。但在这个简单的例子中,我不认为有太多的罗嗦。