Оператор select и вложенные подзапросы

SELECT с использованием вложенных подзапросов:

-- FIND QUESTIONS WITH THE MAXIMUM AND MINIMUM LENGTH --

SELECT TOP(1) q.Name, res.[Question length], res.Name as 'Subject', res.Full_Name as 'Creator'

FROM dbo.Question q,

(SELECT TOP (1) MAX(LEN(q.Name)) as 'Question length', t.Name, a.Full_Name, q.Id

FROM dbo.TestCase t, dbo.Question q, dbo.Account a

WHERE t.Id = q.Id_Test AND a.Id = t.Id_Creator

GROUP BY t.Id, t.Name, a.Full_Name, q.Id

ORDER BY 1 DESC) res

WHERE res.Id = q.Id

UNION ALL

SELECT TOP(1) q.Name, res.[Question length], res.Name as 'Subject', res.Full_Name as 'Creator'

FROM dbo.Question q,

(SELECT TOP (1) MIN(LEN(q.Name)) as 'Question length', t.Name, a.Full_Name, q.Id

FROM dbo.TestCase t, dbo.Question q, dbo.Account a

WHERE t.Id = q.Id_Test AND a.Id = t.Id_Creator

GROUP BY t.Id, t.Name, a.Full_Name, q.Id

ORDER BY 1 ASC) res

WHERE res.Id = q.Id

ORDER BY 3 DESC;

-- FIND A TESTCASE WITH THE LONGEST DURATION AND SHOW WHO IS AN AUTHOR OF THIS QUESTION --

SELECT TOP(1) *

FROM dbo.Account a

WHERE a.Id =

(SELECT TOP(1) t.Id_Creator

FROM dbo.TestCase t

ORDER BY t.Time_To_Answer DESC);


Выводы

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

Во время создания кода на T - SQL столкнулись с рядом проблем. Во-первых не была найдена тернарная операция. Часто бывает проще написать одну такую операцию, чем вставлять громоздкую конструкцию CASE. Более того, CASE не поддерживает диапазоны и сравнения, и поэтому он мало применим для чисел с плавающей запятой.

Во-вторых, возникли проблемы с GROUP BY. Вначале мы выбираем поле, по которому будем объединять, но потом приходится дописывать туда все те поля, которые мы хотим вывести результат запроса SELECT. Это неудобно учитывая тот факт, что выражения типа "dbo. MyTable.*" в GROUP BY запрещены.

В-третьих, оказалось, что обращаться по номеру колонки не так просто, как хотелось бы. Особенно это видно в конструкциях с WHERE и HAVING, где мы хотим вместо громоздкого выражения подставить номер колонки, но при функция начинает воспринимать этот номер как число.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: