在Microsoft SQL Server 2005或更高版本中,我想获得第一行,如果没有匹配的行,则返回具有默认值的行。
SELECT TOP 1 ID,Name
FROM TableName
UNION ALL
SELECT 0,''
ORDER BY ID DESC
除了在表中有数据的情况下返回两行,在表中没有数据的情况下返回第一行,这是可行的。
我希望它总是返回1行。
我认为这与EXISTS有关,但我不确定。
就像这样:
SELECT TOP 1 * FROM Contact
WHERE EXISTS(select * from contact)
但如果不存在,则选择0,''
最佳答案
当表格非常满并且您可能想要指定要获取的前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