SQL Server前1名

Phi*_*enn 5 sql t-sql sql-server sql-server-2005

在Microsoft SQL Server 2005或更高版本中,我想获取第一行,如果没有匹配的行,则返回具有默认值的行.

SELECT TOP 1 ID,Name
FROM TableName
UNION ALL 
SELECT 0,''
ORDER BY ID DESC
Run Code Online (Sandbox Code Playgroud)

这是有效的,除非它在表中有数据时返回两行,如果没有则返回1行.我希望它总能返回1排.我认为它与EXISTS有关,但我不确定.它会是这样的:

SELECT TOP 1 * FROM Contact 
WHERE EXISTS(select * from contact)
Run Code Online (Sandbox Code Playgroud)

但如果不是EXISTS,那么选择0,''

Eri*_*ikE 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
Run Code Online (Sandbox Code Playgroud)

不同的是,内部查询具有顶部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
Run Code Online (Sandbox Code Playgroud)


OMG*_*ies 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
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)