删除包含子查询的 sql 查询中的冗余
Removing redundancies in sql query that contains subquery
假设我们有一个 table 方案
student(id (primary key), name, math_score, english_score)
我正在尝试获取排名最高的学生信息(ID 和姓名)(按数学成绩和英语成绩的最高总和排序)。可能有几个打领带的学生,我们要他们所有人。我考虑这样做的方法是使用子查询来获得具有分数总和的 table,然后找到具有最高总和的 ID、名称。
SELECT s.id, s.name
FROM (SELECT s.id, s.name, s.math_score+s.english_score as sum
FROM student s) s
WHERE s.sum = (SELECT max(s.sum)
FROM (SELECT s.id, s.name, s.math_score+s.english_score as sum
FROM student s) s)
这可行,但似乎非常多余且效率不高。
我刚开始学习 sql 语言,希望能对这个问题有一些见解!
搭配使用
create table #student(
id int primary key identity(1,1),
name varchar(50),
math_score decimal,
english_score decimal
)
insert into #student
values
('Tom', 90, 90),
('Dick', 70, 70),
('Harry', 80, 100)
select TOP(1) WITH TIES
id,
name,
math_score,
english_score,
math_score + english_score as ScoreRank
from #student
order by
math_score + english_score desc
给出答案:
id|name|math_score|english_score|ScoreRank
1|Tom|90|90|180
3|Harry|80|100|180
SELECT id, name, math_score+english_score as 'sum'
FROM student
Order by math_score+english_score DESC;
这应该可以完成,您添加了一个不必要的步骤。
select id,
name,
math_score+english_score as total_score
from student
where math_score+english_score=(select max(math_score+english_score)
from student)
假设我们有一个 table 方案
student(id (primary key), name, math_score, english_score)
我正在尝试获取排名最高的学生信息(ID 和姓名)(按数学成绩和英语成绩的最高总和排序)。可能有几个打领带的学生,我们要他们所有人。我考虑这样做的方法是使用子查询来获得具有分数总和的 table,然后找到具有最高总和的 ID、名称。
SELECT s.id, s.name
FROM (SELECT s.id, s.name, s.math_score+s.english_score as sum
FROM student s) s
WHERE s.sum = (SELECT max(s.sum)
FROM (SELECT s.id, s.name, s.math_score+s.english_score as sum
FROM student s) s)
这可行,但似乎非常多余且效率不高。
我刚开始学习 sql 语言,希望能对这个问题有一些见解!
搭配使用
create table #student(
id int primary key identity(1,1),
name varchar(50),
math_score decimal,
english_score decimal
)
insert into #student
values
('Tom', 90, 90),
('Dick', 70, 70),
('Harry', 80, 100)
select TOP(1) WITH TIES
id,
name,
math_score,
english_score,
math_score + english_score as ScoreRank
from #student
order by
math_score + english_score desc
给出答案:
id|name|math_score|english_score|ScoreRank
1|Tom|90|90|180
3|Harry|80|100|180
SELECT id, name, math_score+english_score as 'sum'
FROM student
Order by math_score+english_score DESC;
这应该可以完成,您添加了一个不必要的步骤。
select id,
name,
math_score+english_score as total_score
from student
where math_score+english_score=(select max(math_score+english_score)
from student)