【问题标题】:SQL Server : shortest syntax using distinct?SQL Server:使用不同的最短语法?
【发布时间】:2017-04-26 13:27:13
【问题描述】:
SELECT TOP 2 name, lastname, city, DISTINCT(age) 
FROM [table1]
WHERE city = 'london' AND name = 'John'
ORDER BY date DESC

我环顾四周,发现 SQL Server 的 distinct 语法很长 - 有没有更好的方法来做到这一点?短而干净(相对)?

目标:返回 2 条记录,其中一条记录年龄 = 18,另一条记录年龄 = 21(均按日期最新)

附:如何在 SQL Server 2016 中实现这一点?

【问题讨论】:

  • 每行不同的作品,而不是每列。您的查询无效。此外,即使您将 distinct 移动到正确的位置,您也会收到错误消息,因为如果您使用 distinct,则无法使用 select 子句中不包含的 order by。我建议一起删除不同的,看看你得到了什么。
  • 好的。您误解了 short 更好,这在 SQL 中是不正确的。您需要编写高性能代码而不是短代码。忘记优雅,数据库的最佳 sql 代码对大多数开发人员来说似乎并不优雅。
  • @HLGEM 优雅是相对的。一个基于集合的方法代码可以很好地快速完成工作对于 sql 来说是优雅的,即使它对于编程语言来说并不优雅。
  • @HLGEM 你能给我一个工作示例,我将如何用高性能代码解决这个问题?
  • 您是否尝试删除 distinct 关键字?

标签: sql-server distinct sql-server-2016


【解决方案1】:

您可以尝试使用 UNION 运算符在两个单独的查询中获取 age=18 和 age=21,然后作为单个输出获取。

SELECT TOP 1 name, lastname, city, age, date
FROM [table1]
WHERE city = 'london' AND name = 'John'
AND Age = '18'
UNION
SELECT TOP 1 name, lastname, city, age, date
FROM [table1]
WHERE city = 'london' AND name = 'John'
AND Age = '21'
ORDER BY date DESC

希望这会有所帮助,您必须根据您的要求修改查询。

【讨论】:

    【解决方案2】:

    要实现你所说的你的要求是:

    Select * from
    (SELECT TOP 1 name, lastname, city, age 
    FROM [table1]
    WHERE city = 'london' AND name = 'John' and Age = 18
    ORDER BY date DESC)b
    union all 
    Select * from 
    (SELECT TOP 1 name, lastname, city, age 
    FROM [table1]
    WHERE city = 'london' AND name = 'John' and Age = 21
    ORDER BY date DESC) b
    

    请注意,这既不长也不复杂。因为在 UNION 查询中不允许直接排序,所以我不得不将单个查询放入派生表中。我使用了 UNION ALL,它比 Union 更快,因为每个单独的查询都会有互斥的结果(你不能同时是 18 和 21)。

    您可以立即得到您想要的结果,但只需执行 SELECT TOP 2 姓名、姓氏、城市、年龄 来自 [表 1] WHERE 城市 = '伦敦' AND 名称 = '约翰' 按日期顺序排序

    但是,由于数据会随着时间而变化,即使今天返回正确的结果,也不一定总是返回正确的结果。如果您真正想要的是两个最近的记录,则此查询很好,但如果您想要您给出的每个特定年龄中的最新记录,则不是。

    当您编写 SQL 代码时,简洁和优雅是您最不想要的品质。您首先需要几件事。首先,需要根据数据的含义返回正确的结果集。接下来,您需要确保查询将尽快执行。 UNION ALL 通常比使用 distinct 或 grouping 更快。编写 SQL 时,性能是 100% 的考虑因素。性能在数据库中很重要。这并不意味着您需要对所有内容进行微调以尽可能地获得最佳性能,但这确实意味着您应该在已知更好的替代方案时尽量避免已知的代价高昂的操作,即使这会导致更长、更复杂的代码。

    【讨论】:

      猜你喜欢
      • 2017-03-20
      • 1970-01-01
      • 1970-01-01
      • 2011-05-26
      • 2015-02-13
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 2014-10-28
      相关资源
      最近更新 更多