简化SQL查询,减少连接数
该查询给出了正确的结果,但我希望查询的行数是最佳的。这能简化吗简化SQL查询,减少连接数,sql,sql-server,tsql,Sql,Sql Server,Tsql,该查询给出了正确的结果,但我希望查询的行数是最佳的。这能简化吗 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
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
)
如果我的逻辑正确的话,你会想要统计前三大洲的事件。以下是获取此信息的更简单方法:
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;
示例数据、所需结果和逻辑解释都会有所帮助。此URL中给出了该问题,作为SQL挑战的一部分>使用TOP With anny ORDER BY将返回100%非确定性随机。。获得纯100%确定性修复的唯一方法是向ORDERBY子句至少添加一个主列或唯一列。。最有可能的帮助是添加一列,您知道该列具有唯一值,或者很可能具有唯一值,如DATETIME6。。由于ANSI/iSO SQL标准将SQL表/结果定义为无序。我建议您在尝试接受挑战之前,先学习使用最佳实践编写代码。使用3个零件名称会降低在数据库之间移动的灵活性。您为每个表定义了别名,但从未使用它们。在不需要的时候,你可以在每个名字周围使用方括号,这使得阅读代码变得更加困难。最后,如果你想要答案,请参加课程。并认为你违反了你同意与该网站达成的协议。也许阅读练习中给出的提示?