What is the use of WITH TIES keyword in SELECT statement in SQL Queries?
Categories:
Understanding the 'WITH TIES' Keyword in SQL SELECT Statements

Explore the functionality of the WITH TIES
clause in SQL Server's SELECT
statements, how it works with TOP
, and practical examples for retrieving additional rows.
When working with SQL queries, especially when you need to limit the number of results, the TOP
clause is incredibly useful. However, what happens if the 'top N' results include rows that share the same value in the ORDER BY
column as the Nth row? This is where the WITH TIES
keyword comes into play, providing a powerful way to ensure you don't inadvertently exclude relevant data.
What is 'WITH TIES'?
The WITH TIES
keyword is an optional clause that can be used in conjunction with the TOP
clause in a SELECT
statement. Its primary purpose is to include all rows that tie for the last place in the limited result set, based on the ORDER BY
clause. Without WITH TIES
, TOP N
would simply return the first N rows, even if the Nth row has identical sorting values to subsequent rows that would otherwise be excluded.
WITH TIES
clause must be used with the ORDER BY
clause. If ORDER BY
is omitted, WITH TIES
will result in a syntax error because there's no defined order to determine ties.How 'WITH TIES' Works
When you specify TOP N WITH TIES
, SQL Server first sorts the entire result set according to the ORDER BY
clause. It then identifies the Nth row. After that, it includes all rows from the sorted set up to and including any rows that have the exact same values in the ORDER BY
columns as the Nth row. This means the final result set might contain more than N rows.
flowchart TD A[Start SELECT Query] --> B{Has TOP N clause?} B -- No --> C[Return all results] B -- Yes --> D{Has ORDER BY clause?} D -- No --> E[Error: WITH TIES requires ORDER BY] D -- Yes --> F[Sort results by ORDER BY] F --> G[Identify Nth row] G --> H{Has WITH TIES?} H -- No --> I[Return first N rows] H -- Yes --> J[Include Nth row and all tied rows] J --> K[Return final result set] K --> L[End]
Flowchart illustrating the logic of TOP N and TOP N WITH TIES.
Practical Examples
Let's consider a scenario with a simple Products
table to demonstrate the difference between TOP N
and TOP N WITH TIES
.
CREATE TABLE Products (
ProductID INT PRIMARY KEY,
ProductName VARCHAR(50),
Price DECIMAL(10, 2)
);
INSERT INTO Products (ProductID, ProductName, Price) VALUES
(1, 'Laptop', 1200.00),
(2, 'Mouse', 25.00),
(3, 'Keyboard', 75.00),
(4, 'Monitor', 300.00),
(5, 'Webcam', 75.00),
(6, 'Headphones', 150.00),
(7, 'Speaker', 75.00),
(8, 'Printer', 200.00);
SQL script to create and populate a sample Products table.
Example 1: Using TOP N without WITH TIES
Suppose we want to find the top 3 cheapest products. Without WITH TIES
, if there are multiple products with the same price as the 3rd cheapest, only the first ones encountered (based on internal ordering or secondary sort if specified) will be returned.
SELECT TOP 3 ProductID, ProductName, Price
FROM Products
ORDER BY Price ASC;
Query to get the top 3 cheapest products without WITH TIES.
Expected Output (may vary slightly depending on internal order for ties):
ProductID | ProductName | Price
----------|-------------|-------
2 | Mouse | 25.00
3 | Keyboard | 75.00
5 | Webcam | 75.00
Notice that 'Speaker' (ProductID 7) also has a price of 75.00, but it's excluded because TOP 3
strictly limits the count to three rows.
Example 2: Using TOP N WITH TIES
Now, let's use WITH TIES
to include all products that share the same price as the 3rd cheapest product.
SELECT TOP 3 WITH TIES ProductID, ProductName, Price
FROM Products
ORDER BY Price ASC;
Query to get the top 3 cheapest products including ties.
Expected Output:
ProductID | ProductName | Price
----------|-------------|-------
2 | Mouse | 25.00
3 | Keyboard | 75.00
5 | Webcam | 75.00
7 | Speaker | 75.00
In this case, 'Speaker' (ProductID 7) is included because its price (75.00) ties with the price of 'Keyboard' (ProductID 3) and 'Webcam' (ProductID 5), which are part of the top 3 cheapest. The result set now contains 4 rows instead of 3.
WITH TIES
when you need to ensure fairness or completeness in your limited result sets, especially in ranking or 'top N' scenarios where ties are meaningful.Limitations and Considerations
While WITH TIES
is powerful, it's important to be aware of its implications:
- Performance: Including
WITH TIES
might slightly impact performance if there are many ties, as the database engine needs to evaluate more rows to determine the full set of ties. - Result Set Size: The number of rows returned can be greater than the specified
N
. Your application logic should be prepared to handle a variable number of rows. - ORDER BY Requirement: As mentioned,
ORDER BY
is mandatory. If your query doesn't inherently need an order, you might need to add one (e.g., by a primary key) to useWITH TIES
effectively. - Compatibility:
WITH TIES
is a feature primarily found in SQL Server. Other database systems might have different syntax or approaches for similar functionality (e.g., using window functions likeRANK()
orDENSE_RANK()
).
In conclusion, WITH TIES
is a valuable tool in SQL Server for scenarios where you need to retrieve a limited number of rows but also want to include all rows that share the same sorting criteria as the last row in that limit. It ensures that no relevant data is arbitrarily excluded due to ties in the ORDER BY
clause.