在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

10-07 15:54