【问题标题】: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 应该完全符合您的要求

标签: sql sql-server ssms


【解决方案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按钮
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 2021-04-26
  • 1970-01-01
相关资源
最近更新 更多