如何编写查询以仅在满足条件时才显示值?
Posted
技术标签:
【中文标题】如何编写查询以仅在满足条件时才显示值?【英文标题】:How to write a query to display values only if the condition is met? 【发布时间】:2022-01-10 16:33:55 【问题描述】:这是我目前的查询:
SELECT
COUNT(OA.ATHLETE_NAME) AS 'Number of athletes',
OG.GAMES_YEAR
FROM
[Olympics].[Events_Facts] AS OEF
JOIN
[Olympics].[Games] AS OG ON OEF.GAMES_ID = OG.GAMES_ID
JOIN
[Olympics].[Athletes] AS OA ON OEF.ATHLETE_ID = OA.ATHLETE_ID
GROUP BY
OG.GAMES_YEAR
我想在我的查询中指定,如果一名运动员来自德国,则仅显示 1991 年奥运会之后的参赛人数。
【问题讨论】:
使用where
子句?
请用示例数据和期望的结果说明,见Minimal, Reproducible Example
你可以写类似where country <> 'germany' or year >= 1991
那么@derpirscher 的建议应该有效。
@aby_g 条件等于 (country = Germany and year > 1991) or country <> Germany
应该完全符合您的要求
【参考方案1】:
SELECT
COUNT(OA.ATHLETE_NAME) AS 'Number of athletes',
OG.GAMES_YEAR
FROM
[Olympics].[Events_Facts] AS OEF
JOIN
[Olympics].[Games] AS OG ON OEF.GAMES_ID = OG.GAMES_ID
JOIN
[Olympics].[Athletes] AS OA ON OEF.ATHLETE_ID = OA.ATHLETE_ID
WHERE
OA.FROM_COUNTRY = 'Germany' and OG.GAMES_YEAR > 1991
GROUP BY
OG.GAMES_YEAR
union all
SELECT
COUNT(OA.ATHLETE_NAME) AS 'Number of athletes',
OG.GAMES_YEAR
FROM
[Olympics].[Events_Facts] AS OEF
JOIN
[Olympics].[Games] AS OG ON OEF.GAMES_ID = OG.GAMES_ID
JOIN
[Olympics].[Athletes] AS OA ON OEF.ATHLETE_ID = OA.ATHLETE_ID
WHERE
OA.FROM_COUNTRY <> 'Germany'
GROUP BY
OG.GAMES_YEAR
通过使用OR
命令,我们可以更简单地编写此查询,而无需使用UNION ALL
命令。但是OR
不推荐性能。
【讨论】:
如何衡量 SSMS 的性能?But OR is not recommended by performance.
这通常是正确的,但我对它作为一般建议持怀疑态度。事实上,特别是在这种情况下,我建议同时测量两种方式。原因是基线查询没有以where
子句开头,因此查询计划可能使用全表扫描。 or
影响性能,因为它使使用索引变得更加困难,但如果我们已经在查看全表扫描,or
的成本可能为 0。从可读性的角度来看,我确实更喜欢你的版本。
@Brandon 但是如果有一个索引(FROM_COUNTRY, GAMES_YEAR)
并且基线查询是OR
版本,UNION ALL
很可能会更快。是的,原件正在进行全面扫描,但需要所有结果。这与性能问题无关,您唯一应该查看的是哪个查询得到 这些 结果
@Aby_g SET STATISTICS IO, TIME ON;
是一个好的开始。你也可以使用Include Client Statistics
按钮以上是关于如何编写查询以仅在满足条件时才显示值?的主要内容,如果未能解决你的问题,请参考以下文章