【发布时间】:2014-01-09 17:32:54
【问题描述】:
我对 data.stackexchange.com 运行了一个相当复杂的 SQL 查询。该查询可以在this link 找到(并粘贴在下面)。
DECLARE @Location varchar(128) = ##Location:string##
DECLARE @RepLimit int = ##RepLimit:int##
SELECT Users.DisplayName,
Users.Id,
Users.WebsiteUrl,
Users.Reputation,
(
SELECT COUNT(*)
FROM Posts
JOIN PostTags ON Posts.ParentId = PostTags.PostId
JOIN Tags ON PostTags.TagId = Tags.Id
WHERE Posts.PostTypeId = 2
AND Tags.Id = 3 -- Javascript
AND Posts.OwnerUserId = Users.Id
) AS JavascriptCount,
(
SELECT COUNT(*)
FROM Posts
JOIN PostTags ON Posts.ParentId = PostTags.PostId
JOIN Tags ON PostTags.TagId = Tags.Id
WHERE Posts.PostTypeId = 2
AND Tags.Id = 5 -- PHP
AND Posts.OwnerUserId = Users.Id
) AS PhpCount,
(
SELECT COUNT(*)
FROM Posts
JOIN PostTags ON Posts.ParentId = PostTags.PostId
JOIN Tags ON PostTags.TagId = Tags.Id
WHERE Posts.PostTypeId = 2
AND Tags.Id = 820 -- jQuery
AND Posts.OwnerUserId = Users.Id
) AS jQueryCount,
(
SELECT COUNT(*)
FROM Posts
JOIN PostTags ON Posts.ParentId = PostTags.PostId
JOIN Tags ON PostTags.TagId = Tags.Id
WHERE Posts.PostTypeId = 2
AND Tags.Id = 21 -- MySQL
AND Posts.OwnerUserId = Users.Id
) AS MySqlCount,
(
SELECT COUNT(*)
FROM Posts
JOIN PostTags ON Posts.ParentId = PostTags.PostId
JOIN Tags ON PostTags.TagId = Tags.Id
WHERE Posts.PostTypeId = 2
AND Tags.Id = 1386 -- Android
AND Posts.OwnerUserId = Users.Id
) AS AndroidCount,
(
SELECT COUNT(*)
FROM Posts
JOIN PostTags ON Posts.ParentId = PostTags.PostId
JOIN Tags ON PostTags.TagId = Tags.Id
WHERE Posts.PostTypeId = 2
AND Tags.Id IN (58338, 81106, 92809, 7003) -- IOS
AND Posts.OwnerUserId = Users.Id
) AS IosCount
FROM Users
WHERE Users.Reputation > @RepLimit
AND Users.Location = @Location
在上面的查询中,发生了一些事情:
- 在 data.stackexchange.com 上,他们为我生成了一个表单字段,让我输入顶部有
DECLAREd 的数据(在本例中为 Location 和 RepLimit)。 - 我正在搜索的标签(Javascript、iOS、Android、PHP 等)是硬编码的,每个标签都使用一个子选择,效率不如我想象的那么高。
我想更改两件事,但对 SQL Server 不够熟悉,无法知道它们是否都可行(而且也不知道要查询什么才能找到我需要的结果)。这两个变化是:
- 我想优化查询。现在,我觉得制作六个几乎相同的子选择并不是完成最终结果的理想方式。
- 我希望将标签列表提供为新表单元素中的逗号分隔列表(顶部为
DECLAREd,如 Location 和 RepLimit),或 5 个单独的表单字段(限制查询最多 5 个不同的标签)
有没有人有过类似查询的经验(或类似的问题,让查询返回的实际列是动态的?)。任何帮助表示赞赏。
【问题讨论】:
标签: sql-server tsql query-optimization dataexplorer