我正在运行一个查询,我想从查询结果中选择第一行。如果我在表中有两行,它将返回一个结果,但如果我只有一行,它将不返回任何内容。
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
答案 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