SQL Server Топ 1 - PullRequest
       31

SQL Server Топ 1

5 голосов
/ 04 февраля 2010

В Microsoft SQL Server 2005 или более поздней версии я хотел бы получить первую строку, а если нет подходящей строки, вернуть строку со значениями по умолчанию.

SELECT TOP 1 ID,Name
FROM TableName
UNION ALL 
SELECT 0,''
ORDER BY ID DESC

Это работает, за исключением того, что возвращает две строки, если в таблице есть данные, и 1 строку, если нет. Я бы хотел, чтобы он всегда возвращал 1 строку. Я думаю, что это как-то связано с EXISTS, но я не уверен. Это было бы что-то вроде:

SELECT TOP 1 * FROM Contact 
WHERE EXISTS(select * from contact)

Но если не СУЩЕСТВУЕТ, ВЫБЕРИТЕ 0, ''

Ответы [ 5 ]

6 голосов
/ 05 февраля 2010

Что происходит, когда таблица очень заполнена, и вы можете указать, какую строку из вашей первой вершины получить, например, имя? В этом случае запрос OMG Ponies вернет неправильный ответ, если вы просто измените предложение ORDER BY. Его запрос также стоит примерно на 8% больше процессора, чем эта модификация (хотя он имеет равные чтения)

SELECT TOP 1 *
FROM (
   SELECT TOP 1 ID,Name
   FROM TableName
   ORDER BY Name
   UNION ALL
   SELECT 0,''
) X
ORDER BY ID DESC

Разница в том, что внутренний запрос также имеет TOP 1, и , который TOP 1 может быть указан там (как показано).

Просто для удовольствия, это еще один способ сделать это, который выполняет очень близко к вышеупомянутому запросу (от -15мс до + 30мс). Хотя это и сложнее, чем необходимо для такого простого запроса, он демонстрирует методику, которую я не вижу, чтобы другие люди SQL часто использовали.

SELECT
   ID = Coalesce(T.ID, 0),
   Name = Coalesce(T.Name, '')
FROM
   (SELECT 1) X (Num)
   LEFT JOIN (
      SELECT TOP 1 ID, Name
      FROM TableName
      ORDER BY ID DESC
   ) T ON 1 = 1 -- effective cross join but does not limit rows in the first table
5 голосов
/ 04 февраля 2010

Использование:

  SELECT TOP 1
         x.id,
         x.name
    FROM (SELECT t.id,
                 t.name
            FROM TABLENAME t
          UNION ALL
          SELECT 0, 
                 '') x
ORDER BY id DESC

Использование эквивалента CTE:

WITH query AS (
    SELECT t.id,
           t.name
      FROM TABLENAME t
    UNION ALL
    SELECT 0, 
           '')
  SELECT TOP 1
         x.id,
         x.name
    FROM query x
ORDER BY x.id DESC
2 голосов
/ 04 февраля 2010
CREATE TABLE #sample(id INT, data VARCHAR(10))

SELECT TOP 1 id, data INTO #temp FROM #sample
IF @@ROWCOUNT = 0 INSERT INTO #temp VALUES (null, null)
SELECT * FROM #temp
1 голос
/ 04 февраля 2010

поставить верхний предел запроса UNION

SELECT TOP 1 * FROM(
SELECT  ID,Name
FROM TableName
UNION ALL 
SELECT 0,''
) z
ORDER BY ID DESC
1 голос
/ 04 февраля 2010
IF EXISTS ( SELECT TOP 1 ID, Name FROM TableName )
 BEGIN
     SELECT TOP 1 ID, Name FROM TableName
 END
ELSE
 BEGIN
 --exists returned no rows
 --send a default row
 SELECT 0, ''
 END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...