Упростите SQL-запрос, уменьшив количество соединений - PullRequest
0 голосов
/ 27 июня 2019

Запрос дает правильные результаты, но я хочу оптимальный запрос с точки зрения количества строк. Можно ли это упростить?

SELECT 

[EventName]

  FROM [WorldEvents].[dbo].[tblEvent] EVNT
  INNER JOIN
  [WorldEvents].[dbo].[tblCountry] CTRY
  ON
  EVNT.CountryID = CTRY.CountryID
  INNER JOIN
  [WorldEvents].[dbo].[tblContinent] CNT
  ON
  CNT.ContinentID = CTRY.ContinentID
  WHERE [ContinentName] 
   IN
  (
  SELECT CNAME FROM(

            SELECT TOP 3
            [ContinentName] AS CNAME,
            COUNT(EventName) AS EVENT_PER_CONTINENT
            FROM (
            SELECT [ContinentName],
            [EventName]
            --,SUM(COUNT(EventName) OVER(PARTITION BY [ContinentName] ORDER BY [ContinentName] ,[EventName]) AS COUNT

            FROM [WorldEvents].[dbo].[tblContinent] CONTINENT
            INNER JOIN 
            [WorldEvents].[dbo].[tblCountry] COUNTRY
            ON
            CONTINENT.ContinentID = COUNTRY.ContinentID
            INNER JOIN 
            [WorldEvents].[dbo].[tblEvent] EVE
            ON 
            EVE.[CountryID] = COUNTRY.[CountryID]

            ) TABLE1

GROUP BY 
[ContinentName]

ORDER BY EVENT_PER_CONTINENT
ASC
) TABLE2

)

1 Ответ

1 голос
/ 27 июня 2019

Если я правильно следую логике, вы хотите, чтобы количество событий из «трех верхних» континентов учитывалось.Вот более простой способ получить эту информацию:

SELECT EventName
FROM (SELECT ContinentID, EventName,
             DENSE_RANK() OVER (ORDER BY cnt, ContinentID) as seqnum
      FROM (SELECT c.ContinentID, e.EventName
                   COUNT(*) OVER (PARTITION BY c.ContinentID) AS cnt
            FROM [WorldEvents].[dbo].[tblCountry] c INNER JOIN 
                 [WorldEvents].[dbo].[tblEvent] e
                 ON e.[CountryID] = c.CountryID
           ) ce
     ) ce
WHERE seqnum <= 3;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...