在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)
但如果不是EXISTS,那么SELECT 0,''
答案 0 :(得分:6)
当桌子非常满时,您可能想要指定前1的哪一行,例如名字,会发生什么?如果您只是更改ORDER BY子句,那么OMG Ponies的查询将返回错误的答案。他的查询也比这次修改花了大约8%的CPU(虽然它有相同的读数)
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可以在那里指定(如图所示)。
只是为了好玩,这是另一种方法,它与上述查询非常接近(-15ms到+ 30ms)。虽然这对于这样一个简单的查询来说比复杂的要复杂得多,但它演示了一种我不会经常看到其他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
答案 1 :(得分:5)
使用:
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 :(得分:2)
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
答案 3 :(得分:1)
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
答案 4 :(得分:1)
将顶部放在UNION查询之外
SELECT TOP 1 * FROM(
SELECT ID,Name
FROM TableName
UNION ALL
SELECT 0,''
) z
ORDER BY ID DESC