为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM8
【操作系统】:win11
【CPU】:amd 锐龙5800h
【问题描述】*:有一个比较长的sql,报“引用列不存在”错误,复制该sql到mysql上发现它可以执行,但在达梦8就报了这个错,尝试了其他答案的方法还是没解决该问题。
SELECT a.create_time createtime ,
a.id ,
a.shelf_status shelfstatus ,
a.land_group_id landgroupid ,
wm_concat(sc.crop_name) plantingcropstr ,
a.land_acre_unit landacreunit ,
a.land_type_id landtypeid ,
wm_concat(plan.crop_id) cropids ,
a.farm_id farmid ,
a.gis_land_type_id gislandtypeid ,
g.name landgroupname ,
(case
WHEN a.land_acre_unit=2 THEN
round(a.land_acre/10,3)
WHEN a.land_acre_unit=3 THEN
round(a.land_acre/666.67,3)
ELSE a.land_acre end) landacreformu , a.land_type_name landtypename , a.company_id companyid , a.create_by createby , a.land_name landname , a.sh_gis_dkid shgisdkid , a.land_status landstatus , a.update_by updateby , a.land_free_days landfreedays , a.create_mode createmode , a.update_time updatetime , t.gis_land_type_name
FROM tbl_land a
LEFT JOIN tbl_land_group g
ON a.land_group_id = g.id
LEFT JOIN
(SELECT p.crop_id ,
p.land_id
FROM tbl_plant_plan_agri p
WHERE p.plant_status != 3
AND date_format( now( ), '%y-%m-%d' ) >= date_format( p.plant_start_date, '%y-%m-%d' )
AND p.farm_id = 23
UNION
all SELECT p.crop_id ,
p.land_id
FROM tbl_plant_plan_forestry p
WHERE p.plant_status != 3
AND date_format( now( ), '%y-%m-%d' ) >= date_format( p.plant_start_date, '%y-%m-%d' )
AND p.farm_id = 23
UNION
all SELECT p.crop_id ,
p.land_id
FROM tbl_plant_plan_animal p
WHERE p.plant_status != 3
AND date_format( now( ), '%y-%m-%d' ) >= date_format( p.plant_start_date, '%y-%m-%d' )
AND p.farm_id = 32
UNION
all SELECT p.crop_id ,
p.land_id
FROM tbl_plant_plan_fishery p
WHERE p.plant_status != 3
AND date_format( now( ), '%y-%m-%d' ) >= date_format( p.plant_start_date, '%y-%m-%d' )
AND p.farm_id = 23 ) plan
ON a.id = plan.land_id
LEFT JOIN sys_crop sc
ON plan.crop_id = sc.id
LEFT JOIN sys_crop_category ct
ON sc.crop_category_id = ct .id
LEFT JOIN tbl_gis_land_type t
ON a.gis_land_type_id = t.id
WHERE a.shelf_status = 0
AND a.farm_id = 23
AND a.land_group_id = 23
AND a.land_name LIKE concat('%', 23, '%')
AND a.land_status = 23
AND a.land_type_id = 23
AND a.gis_land_type_id =23
GROUP BY a.id
HAVING find_in_set(23,cropids)
ORDER BY a.id DESC
可以排查下具体哪个列引用失败,核对一下授权。
已解决。在 mysql 中 group by 和 having 后面可以使用本条语句 select 部分的字段别名,但在达梦中就不行,会报这个错,把别名去掉,改为实际的值就行。在这里把 find_in_set(23,cropids) 中的 cropids 改为 wm_concat(plan.crop_id) 就行。如果改为 wm_concat(p.crop_id) 会报错,因为 p 是 plan 临时子表内的别名,不能在外面引用。
怀疑是大小写敏感问题,是不是mysql是不敏感的,dm是敏感的,实例建成一样试试