SQL查询中SELECT语句中WITH TIES关键字的用途是什么?

时间:2013-12-31 07:37:23

标签: sql-server tsql

SELECT TOP 5 WITH TIES EmpNumber,EmpName 
FROM Employee 
Order By EmpNumber DESC

以上查询返回五个以上的结果,使用“With Ties”关键字SQL查询。

10 个答案:

答案 0 :(得分:47)

来自TOP (Transact-SQL)

  

当您想要返回两个或多个与最后一个位置相关的行时使用   在有限的结果集中。

请注意示例

SQL Fiddle DEMO

我们有一张桌子,有6个1到4和5个两次。

正在运行

SELECT TOP 5 WITH TIES *
FROM MyTable 
ORDER BY ID;

返回6行,因为最后一行被绑定(存在多次。)

在哪里

SELECT TOP 5 WITH TIES *
FROM MyTable 
ORDER BY ID DESC;

只返回5行,因为最后一行(本例中为2)只存在一次。

答案 1 :(得分:7)

检查此查询并更加明确。

SELECT TOP 5 WITH TIES *
FROM MyTable 
ORDER BY ID;

结果: - 1 2 3 4 五 5

SELECT TOP 5 *
FROM MyTable 
ORDER BY ID;

结果: - 1 2 3 4 5

答案 2 :(得分:5)

为了便于理解,让我们用Northwind DB上的一个简单实例进行解释。假设您需要相同价格的产品。

select 
     UnitPrice
    ,count(UnitPrice) as PriceCount
from Products
group by
    UnitPrice
order by 2 desc

enter image description here

例如,您现在知道当前有 4 种产品的价格为 10,但您仍会得到 2 行 - 与您使用 top 子句发送的结果一样多。

select top 2 UnitPrice,* from Products where UnitPrice=10

enter image description here

对于所有匹配的行,您必须发送带有子句 with ties 的查询。尽管您发送了 top 2,但您将获得更多匹配的行。

select top 2 with ties UnitPrice,* from Products where UnitPrice=10 order by 1

enter image description here

https://docs.microsoft.com/en-us/sql/t-sql/queries/top-transact-sql?view=sql-server-ver15#arguments

<块引用>

返回与有限中最后一位并列的两行或更多行 结果集。您必须将此参数与 ORDER BY 子句一起使用。和 TIES 可能会导致返回的行数多于指定的值 表达。例如,如果表达式设置为 5 但另外两个 行匹配第 5 行 ORDER BY 列的值,结果集 将包含七行。

您只能使用 WITH TIES 参数指定 TOP 子句 SELECT 语句,并且仅当您还指定了 ORDER BY 条款。绑定记录的返回顺序是任意的。订购者 不影响此规则。

答案 3 :(得分:3)

根据BOL“WITH TIES指定从基本结果集返回其他行,其中ORDER BY列中的相同值显示为TOP n(PERCENT)行的最后一行。 TOP ... WITH TIES只能在SELECT语句中指定,并且只有在指定了ORDER BY子句时才能指定。 “

参考此链接这可能有助于Code project

link 2

link 3

答案 4 :(得分:1)

WITH TIES允许您返回更多行,这些行的值与有限结果集中的最后一行相匹配。请注意,WITH TIES可能导致返回的行多于表达式中指定的行。

要返回哪些行的选择是不确定
这意味着,如果在不更改基础数据的情况下再次运行查询,理论上您将获得一组不同的三行。
实际上,行的选择将取决于以下物理条件:

  • 优化选择
  • 存储引擎选择
  • 数据布局
  • 等...

如果您多次实际运行查询,只要这些物理条件没有变化,您很有可能会保持相同的结果。但是至关重要的是要从关系模型中了解“物理数据独立性”原理,并要记住,在逻辑级别上,您无法保证可重复的结果。如果不指定顺序,则应将顺序视为任意顺序,从而导致不确定的行选择。

您当前的结果如下:

EmpNumber EmpName  Ranking
11        Maria    1
23        José     2
456       Pedro    3
456       Pedro    3 --WITH TIES

您的表可能包含重复的行,或者可能具有历史行,因为通常EmpNumber是唯一的。

来自Reference

答案 5 :(得分:0)

假设我们有一个名为myTable的表,其中包含以下数据:

ID NAME SALARY

1个怪胎10000

4芬奇10000

2 RR 6000

3大卫16000

5莱斯利7000

6个沃森10000

查询: 从myTable中选择*

按工资顺序排序

仅获取前3行;

输出: 我们只有Salary中降序排列的前三行

ID NAME SALARY

3大卫16000

1个怪胎10000

4芬奇10000

注意:在上面的结果中,我们获得了前3行,按薪水以降序排列,但还有另外一行薪水相同,即名称为Watson和Salary 10000的行,但是它没有出现,因为我们仅将输出限制为前三行。但这并不是最佳选择,因为在大多数情况下,在实时应用程序中,我们还需要显示绑定的行。

现实生活中的例子 –假设我们有10位赛车手参加比赛,而我们只有3个奖项,即第一,第二,第三名,但假设第3和第4赛车手同时完成了比赛,所以在这种情况下,我们在3和4之间有一个平局,这就是为什么两个人都持有排名3的原因。

答案 6 :(得分:0)

来自here

  

使用 TOP WITH TIES (包含领带的顶部)包括与   最后一行

如果您想使用领带最多,则必须使用订购依据

创建表

CREATE TABLE [dbo].[Products](
[Id] [int] IDENTITY(1,1) NOT NULL,
[ProductName] [nvarchar](50) NULL,
[Price] [float] NULL) 
GO

下面说明了将行插入到现有表中的INSERT语句

INSERT INTO [dbo].[Products] VALUES ('Bicycle 1' , 258.2)
INSERT INTO [dbo].[Products] VALUES ('Bicycle 2' , 265.3)
INSERT INTO [dbo].[Products] VALUES ('Bicycle 3' , 267.8)
INSERT INTO [dbo].[Products] VALUES ('Bicycle 4' , 268.9)
INSERT INTO [dbo].[Products] VALUES ('Bicycle 5' , 267.9)
INSERT INTO [dbo].[Products] VALUES ('Bicycle 6' , 267.9)
GO

然后

SELECT TOP 4 WITH TIES
ProductName, Price
FROM Products
ORDER BY Price

在此示例中,这两种昂贵的产品的标价为267.9。由于该语句使用了 TOP WITH TIES ,因此还返回了另一种产品,其价格价格与第四种产品相同。

here

答案 7 :(得分:0)

据我对WITH TIES子句的理解, 如果要[重复值],该值在订购依据中指定。

答案 8 :(得分:0)

WITH TIES 选项对于 TOP() 谓词很重要。它使最后一个地方 如果这些行在 ORDER BY 中使用的列中具有相等的值,则包括多行 子句。

enter image description here

enter image description here

正如您在第一张图片中看到的,最后一行在 db 中有更多相同的值。

答案 9 :(得分:-1)

SELECT * from myTable order by rank desc fetch first 3 rows With Ties;

给予

ID    NAME       Rank
--------------------------
3    Dhoni     1
1    Geeks     2
6    Watson    3     **// We get Tied Row also**
4    Finch     3