从任何 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 Bys

我们不能强迫用户添加一个单独的查询来模仿我们想要做的事情。

这是错误:

消息 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的主要内容,如果未能解决你的问题,请参考以下文章

SQL如何显示查询结果的前100条?

sql递归cte在视图中不能正常工作

CTE 中的 SQL Server 视图导致性能不佳

SQL Server LEFT OUTER JOIN 查询性能

从视图中的 SQL 子查询返回值列表

SQL 查询没有返回我想要的东西