达梦数据库的order by后面的字段不在select的后面的字段中,报错说order by的字段不在查询项中,请问有什么解决方法,除了把字段添加到select中,能通过修改系统参数来实现吗?因为涉及的sql比较多,改sql的话比较麻烦
这样 可以解决
在数据库参数中设置 allow_order_by_non_selected=true
这个可以永久开启这个功能,对所有session都生效。需要修改数据库参数文件,添加这个参数并设置为true,然后重启数据库即可。
ORDER BY <字段名> [ASC|DESC] --ASC是默认的升序的 如果不写,默认ASC , desc是降序
根据提供的参考资料和问题描述,可以得出以下结论和解决方案:
根据达梦数据库的错误报错信息,当 "order by" 后面的字段不在 "select" 后面的字段中时,会报错。要解决这个问题,除了将字段添加到 "select" 中之外,还可以通过修改SQL语句来解决。
解决方案1: 将字段添加到 "select" 中 根据参考资料段落7中提供的示例,可以将要排序的字段添加到 "select" 后面,以确保 "order by" 后面的字段在 "select" 中存在。具体步骤如下:
示例代码:
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的示例,可以在查询语句中使用常量列来解决此问题。具体步骤如下:
示例代码:
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语句,但是需要注意常量列的值要与需要排序的字段的值保持一致。