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

use*_*256 46 t-sql sql-server

SELECT TOP 5 WITH TIES EmpNumber,EmpName 
FROM Employee 
Order By EmpNumber DESC
Run Code Online (Sandbox Code Playgroud)

以上查询返回五个以上的结果,有什么用"With Ties"关键字SQL查询.

Adr*_*der 53

来自TOP(Transact-SQL)

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

注意这个例子

SQL Fiddle DEMO

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

运行

SELECT TOP 5 WITH TIES *
FROM MyTable 
ORDER BY ID;
Run Code Online (Sandbox Code Playgroud)

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

在哪里

SELECT TOP 5 WITH TIES *
FROM MyTable 
ORDER BY ID DESC;
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢,现在我可以看到差异.它主要取决于结果集的最后一行.如果重复最后一行,那么它将生成更多行.你用这个例子说得更清楚了. (5认同)
  • 有趣的是,经过13年的发展,我从未见过这一点,今天需要找到这样的东西.谢谢! (3认同)

Ame*_*mee 9

检查此查询,将更清楚.

SELECT TOP 5 WITH TIES *
FROM MyTable 
ORDER BY ID;
Run Code Online (Sandbox Code Playgroud)

结果: - 1 2 3 4 5 5

SELECT TOP 5 *
FROM MyTable 
ORDER BY ID;
Run Code Online (Sandbox Code Playgroud)

结果: - 1 2 3 4 5


Rez*_*abi 9

这里

使用TOP WITH TIES包含与最后一行中的值匹配的行

如果要使用TOP WITH TIES,则必须使用order by

创建表

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

下面说明了将行插入到现有表中的 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
Run Code Online (Sandbox Code Playgroud)

然后

SELECT TOP 4 WITH TIES
ProductName, Price
FROM Products
ORDER BY Price
Run Code Online (Sandbox Code Playgroud)

在此示例中,两个昂贵的产品的标价为 267.9。因为该语句使用了TOP WITH TIES,所以它又返回了一种与第四种定价相同的产品。

这里

  • 为什么这个答案不是最佳答案,它绝对清晰简单! (3认同)

gur*_*kan 5

为了更容易理解,让我们用Northwind DB上的一个简单例子来解释。假设您需要相同价格的产品。

select 
     UnitPrice
    ,count(UnitPrice) as PriceCount
from Products
group by
    UnitPrice
order by 2 desc
Run Code Online (Sandbox Code Playgroud)

领带-1]

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

select top 2 UnitPrice,* from Products where UnitPrice=10
Run Code Online (Sandbox Code Playgroud)

with-ties2]

您必须with ties为所有匹配的行提交带有子句的查询。即使您发送了top 2,您也会获得更多匹配的行。

select top 2 with ties UnitPrice,* from Products where UnitPrice=10 order by 1
Run Code Online (Sandbox Code Playgroud)

有关系]

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

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

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