SQL Server:使用distinct的最短语法?

时间:2017-04-26 13:27:14

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

windows.location

我正在环顾四周并注意到SQL Server的SELECT TOP 2 name, lastname, city, DISTINCT(age) FROM [table1] WHERE city = 'london' AND name = 'John' ORDER BY date DESC 语法很长 - 有没有更好的方法呢?短而干净(相对)?

目标:返回2条记录,其中一条记录的年龄= 18,其他一条年龄= 21(两者都是最新的日期)

P.S。如何在SQL Server 2016中实现此目的?

2 个答案:

答案 0 :(得分:0)

您可以尝试使用UNION运算符在两个单独的查询中获取年龄= 18和年龄= 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

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

答案 1 :(得分:0)

为了实现您所说的要求:

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快的UNION ALL,因为每个单独的查询都会有相互排斥的结果(你不能同时是18和21)。

你有可能立即得到你想要的结果,但只是做 SELECT TOP 2名称,姓氏,城市,年龄 来自[table1] WHERE city ='london'和name ='John' ORDER BY date DESC

但是,由于数据随时间而变化,即使今天返回正确的结果,也不太可能始终返回正确的结果。如果您真正想要的是两个最近的记录,则此查询很好,但如果您想要最近的每个特定年龄,这是您要求的。

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