从任何 SQL 查询/视图/CTE 返回前 1
Posted
技术标签:
【中文标题】从任何 SQL 查询/视图/CTE 返回前 1【英文标题】:Return Top 1 from any SQL query/view/CTE 【发布时间】:2020-08-07 06:59:04 【问题描述】:有没有办法只返回一条记录,以便我可以通过下面的代码获取所有列调用?
using (var reader = await command.ExecuteReaderAsync(CommandBehavior.SequentialAccess).ConfigureAwait(false))
DataTable dtResults = new DataTable();
dtResults.Load(reader);
return dtResults;
所以现在这将返回查询中的所有 X 条记录,我只需要返回 1 条记录,这样我就可以将列数据类型等插入到我的 Grid 控件中。
我们不能只添加SELECT Top 1
,因为某些查询以 CTE 等开头。
我们不能将它包裹在另一个查询中,因为有时该查询有 Order By
s
我们不能强迫用户添加一个单独的查询来模仿我们想要做的事情。
这是错误:
消息 1033,第 15 级,状态 1,第 40 行 ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效,除非还指定了 TOP、OFFSET 或 FOR XML。
这里是查询:
SELECT TOP 1 *
FROM
(SELECT O.Department, O.ID
FROM dbo.table1 e
LEFT JOIN dbo.table2 O ON e.Department = O.Department
ORDER BY ID) x
【问题讨论】:
只运行一次reader.Read
,不要将其加载到DataTable
。
【参考方案1】:
如果您只需要元数据,请使用.ExecuteReader(System.Data.CommandBehavior.SchemaOnly)
如果要读取一行,请使用 SQL 的 OFFSET/FETCH 子句。它们附加在语句的末尾,因此可能适用于您的情况。
https://docs.microsoft.com/en-us/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-ver15
请注意,您必须提供一些排序条款。
SELECT
O.Department
,O.ID
FROM dbo.table1 e
LEFT JOIN dbo.table2 O
ON e.Department = O.Department
order by O.ID
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY
【讨论】:
【参考方案2】:试试下面的方法,你不能在 SQL server 中使用 Order by
和子查询。
select top 1 *
from
(
SELECT
O.Department
,O.ID
FROM dbo.table1 e
LEFT JOIN dbo.table2 O
ON e.Department = O.Department
)
Order by
ID
【讨论】:
【参考方案3】:子查询只是不必要的。您可以在外部查询中直接使用top (1)
和order by
:
select top(1) o.department, o.id
from dbo.table1 e
left join dbo.table2 o on e.department = o.department
order by id
【讨论】:
【参考方案4】:sp_describe_first_result_set 应该做你想做的事。它将返回相关命令的元数据。
exec sp_describe_first_result_set @tsql = N'SELECT O.Department, O.ID
FROM dbo.table1 e
LEFT JOIN dbo.table2 O ON e.Department = O.Department
ORDER BY ID'
【讨论】:
以上是关于从任何 SQL 查询/视图/CTE 返回前 1的主要内容,如果未能解决你的问题,请参考以下文章