SQL Server前1名

时间:2010-02-04 18:51:09

标签: sql sql-server sql-server-2005 tsql

在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,''

5 个答案:

答案 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