sql - 简化 SQL 查询,减少连接数
问题描述
该查询给出了正确的结果,但我想要就行数而言的最佳查询。这可以更简化吗?
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
)
解决方案
如果我正确地遵循逻辑,您希望按计数来自“前 3”大洲的事件。这是获取此信息的更简单方法:
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;
推荐阅读
- node.js - 在创建帖子时尝试引用用户时出现 Cast to ObjectId 错误(express -sessions、mongoose)
- android - 如何在Android Layout中将EditBox中的文本划分为TextView和EditBox
- c++ - 为什么 C++ 标准库中没有 SIMD 功能?
- celery - 谁在 celery 中等待 apply_async(countdown=10)
- c++ - 用于创建对象的堆或堆栈?
- javascript - reactjs登录后如何创建受保护的路由
- javascript - 当社区添加了 URL 时,JSForce describeGlobal 不起作用
- listview - xamarin 表单列表视图多选
- database - 主主数据库架构中的主节点是共享相同的数据集还是拥有自己独特的数据集?
- azure - 没有 www 的 URL 重定向到不同的页面