Sql 与CTE一起发布(与..作为施工)
我试图通过在线练习学习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
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并不会减少太多的冗长。我认为我们可以将聚合值放入变量中,然后重用它。您可以使用变量。但在这个简单的例子中,我不认为有太多的罗嗦。