达梦数据库的order by后面的字段不在select的后面的字段中

达梦数据库的order by后面的字段不在select的后面的字段中,报错说order by的字段不在查询项中,请问有什么解决方法,除了把字段添加到select中,能通过修改系统参数来实现吗?因为涉及的sql比较多,改sql的话比较麻烦

这样 可以解决
在数据库参数中设置 allow_order_by_non_selected=true
这个可以永久开启这个功能,对所有session都生效。需要修改数据库参数文件,添加这个参数并设置为true,然后重启数据库即可。

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7690654
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:SQL注入时order by 后面加数字的作用
  • 除此之外, 这篇博客: 数据库的基础学习1:select语句的查询中的  order by:对查询结果通过某一字段排序(可以通过字段名排序) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • ORDER BY <字段名> [ASC|DESC]    --ASC是默认的升序的 如果不写,默认ASC , desc是降序
  • 以下回答由chatgpt基于相关博客总结生成:

    根据提供的参考资料和问题描述,可以得出以下结论和解决方案:

    根据达梦数据库的错误报错信息,当 "order by" 后面的字段不在 "select" 后面的字段中时,会报错。要解决这个问题,除了将字段添加到 "select" 中之外,还可以通过修改SQL语句来解决。

    解决方案1: 将字段添加到 "select" 中 根据参考资料段落7中提供的示例,可以将要排序的字段添加到 "select" 后面,以确保 "order by" 后面的字段在 "select" 中存在。具体步骤如下:

    1. 找到报错的SQL语句中的 "SELECT" 部分。
    2. 将 "ORDER BY" 后面的字段添加到 "SELECT" 后面,使用逗号进行分隔。
    3. 运行修改后的SQL语句,验证是否解决了报错问题。

    示例代码:

    SELECT 
        wpo.id, 
        wco.collection_order_no, 
        wpo.picking_order_no, 
        wpo.add_time, 
        wpo.add_admin_name, 
        wpo.picking_time, 
        wpo.picking_admin_name, 
        wpo.status, 
        wpo.end_time, 
        wpo.sort AS isTop, 
        ceil((UNIX_TIMESTAMP(wpo.end_time)-UNIX_TIMESTAMP(wpo.picking_time))/60) useTime, 
        wpo.picking_type, 
        wco.warehouse_id, 
        sla.logic_area_name, 
        (SELECT count(DISTINCT (source_order_id)) FROM wod WHERE warehouse_picking_order_id = wpo.id) AS orderNum, 
        (SELECT count(1) FROM wod WHERE warehouse_picking_order_id = wpo.id) AS skuNum, 
        wpo.sort -- 将要排序的字段添加到SELECT中
    FROM 
        wpo 
    LEFT JOIN 
        wco ON wpo.warehouse_collection_order_id = wco.id 
    LEFT JOIN 
        sla ON wpo.logic_area_id = sla.id 
    ORDER BY 
        wpo.sort DESC, wpo.status ASC, wpo.add_time ASC 
    LIMIT 10;
    

    解决方案2: 在查询中使用常量列 根据参考资料段落3的示例,可以在查询语句中使用常量列来解决此问题。具体步骤如下:

    1. 找到报错的SQL语句中的 "SELECT" 部分。
    2. 在 "SELECT" 后面添加常量列,将其值设置为需要排序的字段的值。
    3. 运行修改后的SQL语句,验证是否解决了报错问题。

    示例代码:

    SELECT 
        wpo.id, 
        wco.collection_order_no, 
        wpo.picking_order_no, 
        wpo.add_time, 
        wpo.add_admin_name, 
        wpo.picking_time, 
        wpo.picking_admin_name, 
        wpo.status, 
        wpo.end_time, 
        wpo.sort AS isTop, 
        ceil((UNIX_TIMESTAMP(wpo.end_time)-UNIX_TIMESTAMP(wpo.picking_time))/60) useTime, 
        wpo.picking_type, 
        wco.warehouse_id, 
        sla.logic_area_name, 
        (SELECT count(DISTINCT (source_order_id)) FROM wod WHERE warehouse_picking_order_id = wpo.id) AS orderNum, 
        (SELECT count(1) FROM wod WHERE warehouse_picking_order_id = wpo.id) AS skuNum,
        'value' AS orderField -- 使用常量列来代替需要排序的字段
    FROM 
        wpo 
    LEFT JOIN 
        wco ON wpo.warehouse_collection_order_id = wco.id 
    LEFT JOIN 
        sla ON wpo.logic_area_id = sla.id 
    ORDER BY 
        orderField DESC, wpo.status ASC, wpo.add_time ASC 
    LIMIT 10;
    

    通过以上两种解决方案,可以解决达梦数据库报错 "order by" 字段不在 "select" 字段中的问题。使用常量列的方法可以避免修改大量的SQL语句,但是需要注意常量列的值要与需要排序的字段的值保持一致。