В 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'',
Что происходит, когда таблица очень заполнена, и вы можете указать, какую строку из первых 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
Использование:
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
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
помещает верхнюю часть запроса UNION
SELECT TOP 1 * FROM(
SELECT ID,Name
FROM TableName
UNION ALL
SELECT 0,''
) z
ORDER BY ID DESC
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