SQL Server лучший 1

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

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

Это работает, за исключением того, что это возвращает две строки, если существуют данные в таблице и 1 строка если нет. Я хотел бы, чтобы это всегда возвратило 1 строку. Я думаю, что это имеет некоторое отношение, СУЩЕСТВУЕТ, но я не уверен. Это было бы что-то как:

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

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

5
задан OMG Ponies 28 February 2010 в 04:35
поделиться

5 ответов

Что происходит, когда таблица очень заполнена, и вы можете указать, какую строку из первых 1 нужно получить, например, имя? Запрос 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
6
ответ дан 18 December 2019 в 11:56
поделиться

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

  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
5
ответ дан 18 December 2019 в 11:56
поделиться
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
2
ответ дан 18 December 2019 в 11:56
поделиться

помещает верхнюю часть запроса UNION

SELECT TOP 1 * FROM(
SELECT  ID,Name
FROM TableName
UNION ALL 
SELECT 0,''
) z
ORDER BY ID DESC
1
ответ дан 18 December 2019 в 11:56
поделиться
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
1
ответ дан 18 December 2019 в 11:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: