Blog Post

A row has no row number

,

It seems that every month I have someone asking the question about ordering or row numbers for a query. Let’s get one thing clear from the start: there are no "row numbers" in a table.

You can assume that the first row you inserted is row number one, but it’s not. In fact, depending on the indexing or lack of indexing, you may or may not get that row returned first by a query. You can add an ORDER BY when you query the table, and in that case you can get the rows returned in a certain order every time, however the row number is not linked to a row.

As an example. If I have this People table:

ID Name-- -------1  Steve2  Gail

and I query:

select ID, name from people order by name

I get

ID Name-- -------2  Gail1  Steve

I could add a row number

 SELECT row_number() OVER (ORDER BY [name])       , [Name]   FROM dbo.People

and get this:

   Name-- -------1  Gail2  Steve

But "Gail" isn’t linked to "1" as a row number. If I do this:

 INSERT people SELECT 3, 'Bob'

SELECT row_number() OVER (ORDER BY [name])       , [Name]   FROM dbo.People

I now get this:

   Name-- -------1  Bob2  Gail2  Steve


Now "Bob" is 1. You can get row numbers, but they are only linked to an ORDER BY and a specific result set. If the data changes, the row numbers may move.

While it might appear in some queries that you are getting consistent ordering of results, don’t confuse coincidence with causality. You might live on those assumptions for years, building code on them, and then make a few changes and lots of things break.

If you need ordering, use ORDER BY.

Filed under: Blog Tagged: syndicated, T-SQL

Rate

You rated this post out of 5. Change rating

Share

Share

Rate

You rated this post out of 5. Change rating