2015-04-21 1 views
1

Предположим, у нас есть таблица со схемойУдаление избыточности в SQL запрос, который содержит подзапрос

student(id (primary key), name, math_score, english_score) 

Я пытаюсь получить информацию о студенте (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, и я был бы признателен за понимание этой проблемы!

ответ

1

Использование с галстуками

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 
+0

Упс ... исправлено с лучшим ответом. –

+0

Он хочет, чтобы учащиеся с лучшим счетом, включая галстуки ... он работает, попробуйте пример самостоятельно. –

+1

[Конечно же] (http://sqlfiddle.com/#!6/967e1/1) он работает. – paqogomez

-1
 SELECT id, name, math_score+english_score as 'sum' 
     FROM student 
     Order by math_score+english_score DESC; 
+0

Можете ли вы объяснить голос? – BrianAtkins

+0

Я не опустил вас, но это не ограничивает высший разряд. Он показывает всю таблицу. – paqogomez

+0

ОП спросил: «Может быть несколько учеников с галстуком, и мы хотим ** их всех **» – BrianAtkins

1

Это должно выполнить это, вы добавляете в ненужный шаг.

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

Оказывается, 'in' не работает в этом примере, [but' = 'does] (http://sqlfiddle.com/#!6/967e1/2). + 1 – paqogomez

Смежные вопросы