T-SQL SELECT TOP 1

3

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

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


1
没有 ORDER BYTOP (n) 是毫无意义的 - 如果你想要获取数据的 TOP (n),那么你的行按照什么排序呢?除非你指定了数据排序的 具体标准 - 否则它是完全随意的... - marc_s
查询搜索三个表以查找符合条件的用户,然后仅返回第一个符合条件的用户。有没有更好的编写方式? - user3922757
我理解你想做什么 - 我只是在说,如果你不明确指定 ORDER BY,那么你得到的是“第一”行 - 按照 SQL Server 认为可以的方式排序 - 你得不到一个特定的“第一”行 - 任何“第一”行... - marc_s
2个回答

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

这意味着首先运行第一个select,然后取出前1个结果,最后运行第二个和第三个select以确定要排除的内容。

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

其中一种有效的语法是:

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

还有其他方法可以得到相同的结果,但这是我会选择的方法。


1
我 echo @marc_s 的评论。你应该真的使用 order by,这样它就不是任意的了。即使你实际排序的字段是任意的,至少它可以让你确定哪个记录将首先出现。(这样当你调试问题时,你可以做出一些假设) - Nick.McDermaid

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接