Я хочу понять выполнение следующего SQL запроса - PullRequest
0 голосов
/ 01 февраля 2020
create table student(StudentCode varchar,  Marks int);   

insert into student values ('a',100);
insert into student values ('b',100);
insert into student values ('c',100);
insert into student values ('d',90);
insert into student values ('e',90);
insert into student values ('f',80);
insert into student values ('g',70);

SELECT *
FROM student a
WHERE a.StudentCode IN (
        SELECT TOP 1 b.StudentCode
        FROM student b
        WHERE a.marks = b.marks
        );

Выходные данные

StudentCode Marks
1   a   100
2   d   90
3   f   80
4   g   70

Почему каждая запись не повторяется после объединения с подзапросом

Ответы [ 2 ]

0 голосов
/ 01 февраля 2020

Это ваш запрос:

select s.*
from student s
where s.StudentCode in (select top 1 s2.StudentCode
                        from student s2
                        where s2.marks = s.marks
                       );

Коррелированный подзапрос возвращает ровно одну строку. Следовательно, in не требуется. Возвращаемая строка - это строка произвольная для студента с такими же отметками.

Если есть только один студент с данным значением marks - например, 'f' и 'g', то этот ученик совпадает.

В остальном, совпадающий ученик может быть или не быть единственной ссылкой во внешнем запросе. Таким образом, подзапрос отфильтрует их.

Если вы удалите top (1), то запрос вернет всех студентов.

0 голосов
/ 01 февраля 2020

Для каждого значения Марка покажите мне одного студента, у которого оно есть, даже если с этим Марком будет больше учеников. Снимите верхнюю часть, и все будет повторяться:

select * from student a where a.StudentCode in (select b.StudentCode from student b where a.marks=b.marks);
...