T-SQL SELECT TOP 1

时间:2014-11-09 21:40:10

标签: sql sql-server tsql

我正在运行一个查询,我想从查询结果中选择第一行。如果我在表中有两行,它将返回一个结果,但如果我只有一行,它将不返回任何内容。

select TOP 1 u.ID
from [dbo].[User] u
where u.ID <> '5dc89076-e554-42f2-a9ae-787b20f6f56b' AND u.gender != 'male'
except
select [dbo].[Like].likes
from [dbo].[Like]
where [dbo].[Like].[user] = '5dc89076-e554-42f2-a9ae-787b20f6f56b'
except
select [dbo].[Dislike].dislikes
from [dbo].[Dislike]
where [dbo].[Dislike].[user] = '5dc89076-e554-42f2-a9ae-787b20f6f56b'

此查询不返回任何内容

select u.ID
from [dbo].[User] u
where u.ID <> '5dc89076-e554-42f2-a9ae-787b20f6f56b' AND u.gender != 'male'
except
select [dbo].[Like].likes
from [dbo].[Like]
where [dbo].[Like].[user] = '5dc89076-e554-42f2-a9ae-787b20f6f56b'
except
select [dbo].[Dislike].dislikes
from [dbo].[Dislike]
where [dbo].[Dislike].[user] = '5dc89076-e554-42f2-a9ae-787b20f6f56b'

此查询返回Id:9EF5B83E-319A-4E2F-88A1-E67227DBFDCE

2 个答案:

答案 0 :(得分:4)

select TOP 1 u.ID
from ...
except
...

表示它首先运行第一个选择,然后获取前1个结果,最后运行第二个和第三个选择以确定要排除的内容。

这不是你想要的。您希望运行三个查询,排除行,最后获取前1个结果。

一种有效的语法是

select top 1 ID
from (
  select u.ID
  from ...
  except
  ...
) as q

还有其他方法可以提供相同的结果,但这是我要使用的方法。

答案 1 :(得分:0)

或者你可以使用简单的 OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY 关键字

注意:它需要ORDER BY子句。

CREATE TABLE #test (
    Id INT,
    Name varchar(50)
)
GO

INSERT INTO #test VALUES
    (1, 'Soda'),
    (2, 'Coke'),
    (3, 'Beer'),
    (4, 'Wine')
GO

SELECT *
FROM #test
ORDER BY Id
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY
GO

DROP TABLE #test;
GO