【问题标题】:Return Top 1 from any SQL query/view/CTE从任何 SQL 查询/视图/CTE 返回前 1
【发布时间】: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

标签: c# sql sql-server tsql sql-order-by


【解决方案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'  
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-08
          • 1970-01-01
          • 2022-10-13
          • 1970-01-01
          相关资源
          最近更新 更多