@beginer123

Как(откуда) читать SQL-запросы?

столкнулся с проблемой что даже свои запросы которые писал давно, долго вспоминаю что они делали.
Вот допустим есть запрос на 200-300 строк с джинами, групиировками и тд.

Как быстро и правильно их читать?
Т.е что нибудь вроде штуки которая ы раскрашивала блоки которые надо читать первыми, вторыми тд

Т.е допустим книги мы читаем слева на право
А SQL?
  • Вопрос задан
  • 58 просмотров
Пригласить эксперта
Ответы на вопрос 2
tsklab
@tsklab
Системный администратор, программист
Вот допустим есть запрос на 200-300 строк с джинами, групиировками и тд.
Поступайте так же, как и с исходными текстами программ: разбивайте на меньшие куски используя представления (view) и вычисляемые поля в таблицах. Например, сложный поиск можно разделить на 2 представления: для поиска и результата (сам запрос будет коротким):
SearchGrid
SELECT DISTINCT
         SearchName.ID, 
         SearchName.[Year], 
         SearchName.[Name], 
         SearchName.WatchDisplay, 
         SearchName.Icon,
         SearchName.AttributeIcon,
         SearchName.[Range],
         LEFT(SearchName.[Key], 1) AS Kind,
         SearchName.UnitID
    FROM SearchName INNER JOIN SearchLike ON SearchName.[Key] = SearchLike.[Key]
    WHERE ((NOT @P1 IS NULL) AND (SearchLike.Search LIKE '%' + @P1 + '%'))
       OR ((NOT @P2 IS NULL) AND (SearchLike.Search LIKE '%' + @P2 + '%')) 
       OR ((NOT @P3 IS NULL) AND (SearchLike.Search LIKE '%' + @P3 + '%')) 
    ORDER BY SearchName.[Range]


Используя представления:
SearchLike
CREATE VIEW SearchLike
AS
  SELECT Film.ID, 
         ISNULL(CAST(Film.Year AS VARCHAR) + ' ', '') + ISNULL(Head.Name + ' ' + Film.HeadingNumber + ' ', '') 
           + ISNULL(Film.Article + ' ', '') + ISNULL(Film.Name + ' ', '') + ISNULL(Film.NameTranslat + ' ', '') 
           + ISNULL(Film.Addition + ' ', '') + ISNULL(Film.Country + ' ', '') 
           + ISNULL(FilmAttributeGroup.Name + ' ', '') + ISNULL(FilmAttributeValue.Value + ' ', '') AS Search,
         Film.[Key]
    FROM FilmAttributeValue 
      INNER JOIN FilmAttribute ON FilmAttributeValue.ID = FilmAttribute.Attribute 
      INNER JOIN FilmAttributeGroup ON FilmAttributeValue.[Group] = FilmAttributeGroup.ID 
      RIGHT OUTER JOIN Film ON FilmAttribute.Film = Film.ID 
      LEFT OUTER JOIN Film AS Head ON Film.Heading = Head.ID
  --
  UNION
  --
  SELECT Person, 
         [Name], 
         'P' + CAST(Person AS VARCHAR)
    FROM PersonNameFormat
    WHERE ([Format] > 10) OR ([Format] = 0)
--
GO

SearchName
CREATE VIEW SearchName
AS
  -- Фильмы:
  SELECT Film.ID, 
         FilmNamePower.[Year]     AS [Year], 
         FilmNamePower.NameCommon AS [Name], 
         Film.WatchDisplay,
         Film.Icon,
         Film.AttributeIcon,
         '0' + Film.[Range] AS [Range],
         Film.[Key],
         Film.ID AS UnitID
    FROM Film INNER JOIN FilmNamePower ON Film.ID = FilmNamePower.ID
  --
  UNION
  -- Персоны:
  SELECT ID, 
         ISNULL(YEAR(BirthDay), 1900), 
         NameFull, 
         '', 
         NoteIcon, 
         NULL, 
         '1' + CONVERT(VARCHAR, ISNULL(BirthDay, '19000101'), 112) + [Range], 
         [Key],
         -1
    FROM Person

Последний использует представление:
FilmNamePower
CREATE VIEW FilmNamePower
AS
  -- Фильмы:
  SELECT Film.ID,
         Film.[Range],  
         Film.[Range]               AS [RangeSort],  
         ISNULL(Film.[Year], 1895)  AS [Year], 
         Film.TitleCountry          AS NameCommon,
         Film.TitleYearCountry      AS NameYearCountry,
         Film.TitleBase             AS NameBase,
         Film.SearchValue,
         Film.Icon,
         Film.AttributeIcon,
         Film.LastWatch,
         Film.WatchDisplay,
         Film.ID                    AS IDCover
    FROM Film
    WHERE (Heading IS NULL)
  -- Многосерийные фильмы и сериалы:
  UNION
  --
  SELECT Film.ID, 
         Head.[Range] + Film.[Range],  
         Film.[Range],
         ISNULL( ISNULL(Film.[Year], Head.[Year]), 1895), 
         ISNULL(CAST(Head.HeadingName AS VARCHAR(200)), Head.Name) + IIF(Film.HeadingNumber = '','',', ' + Film.HeadingNumber) 
                                                          + IIF((Film.TitleBase IS NULL),'' + Film.PartDisplay, ': ' + Film.TitleBase )
                                                          + ISNULL( ' · ' + ISNULL( Film.Country, Head.Country), ''), 
         ISNULL(CAST(Head.HeadingName AS VARCHAR(200)), Head.Name) 
           + ', ' + Film.HeadingNumber +  
                             + IIF( (Film.TitleBase IS NULL), 
                                                 Film.PartDisplay + ' · ' + CAST(ISNULL( ISNULL(Film.[Year], Head.[Year]), 1895) AS VARCHAR),
                                                ': ' + Film.[TitleYear] )
                             + ISNULL( ' · ' + ISNULL( Film.Country, Head.Country), ''),
         ISNULL(CAST(Head.HeadingName AS VARCHAR(200)), Head.Name) + IIF(Film.HeadingNumber = '','',', ' + Film.HeadingNumber) 
                                                          + IIF((Film.TitleBase IS NULL),'' + Film.PartDisplay, ': ' + Film.TitleBase ), 
         Head.SearchValue + ISNULL('+s' + RIGHT('00' + CONVERT([varchar], Film.Season), 2), ''),
         Film.Icon,
         Film.AttributeIcon,
         Film.LastWatch,
         Film.WatchDisplay,
         Head.ID
    FROM Film 
      INNER JOIN Film AS Head ON Film.Heading = Head.ID 
    WHERE NOT (Film.Heading IS NULL)
--
GO
Ответ написан
baitarakhov
@baitarakhov
Full Stack Developer
Начал писать свои рекомендации и подумал, может есть уже готовая статья и как оказалось, что очень легко гуглиться ответы на подобные вопросы, можешь покурить следующую статью:
https://habrahabr.ru/post/305926/
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
Делис Инфо Москва
от 70 000 до 80 000 руб.
Infotech Group Казань
от 30 000 до 50 000 руб.
Arkadium Ростов-на-Дону
от 120 000 руб.
20 авг. 2018, в 21:21
30000 руб./за проект
20 авг. 2018, в 20:46
5000 руб./за проект
20 авг. 2018, в 20:38
700 руб./в час