联多张表进行更新时会生成多个FROM 返回

openGauss数据库
sugarClient.Updateable<QcpDqkh>()
.InnerJoin<CustomerAll>((q, c) => q.客户号 == c.Cuid)
.InnerJoin<CommonUser>((q, c, u) => c.workno == u.Workno)
.InnerJoin<Network>((q, c, u, n) => c.Networkno == n.Networkno)
.SetColumns((q, c, u, n) => new QcpDqkh()
{
姓名 = c.Customername,
用户 = u.name,
网点 = n.Name
})
.Where((q, c, u, n) => q.数据日期 == DateTime.Now)
.ExecuteCommand();
生成的SQL输出后是
UPDATE "qcp_dqkh" AS "q"
SET
"姓名"="c"."customername","用户"="u"."realname","网点"="n"."name"
FROM "customerall" "c"
FROM "commonuser" "u"
FROM "network" "n" WHERE ( "q"."数据日期" = '2024-07-03 11:38:28.927' ) AND ( "q"."客户号" = "c"."cuid" ) AND ( "c"."workno" = "u"."workno" ) AND ( "c"."networkno" = "n"."networkno" )
帮看看是哪里写的不对还是不支持
热忱回答(22)
-
fate sta VIP0
2024/7/3应该不支持,联表更新超过2个表只有个别库支持
0 回复 -
rookie VIP0
2024/7/3后续会支持吗? 毕竟直接sql写
UPDATE "qcp_dqkh"
SET "姓名"="c"."customername","用户"="u"."realname","网点"="n"."name"
FROM "qcp_dqkh" "q"
JOIN "customerall" "c" ON "q"."客户号" = "c"."cuid"
JOIN "commonuser" "u" ON "c"."workno" = "u"."workno"
JOIN "network" "n" ON "c"."networkno" = "n"."networkno"
WHERE ( "q"."数据日期" = '2024-07-03 00:00:00.000' )
这样就可以执行的
0 回复 -
fate sta VIP0
2024/7/3@rookie:我支持一下
0 回复 -
fate sta VIP0
2024/7/3SqlSugarCore 5.1.4.161-preview10
更新到最新预览版本已支持
0 回复 -
fate sta VIP0
2024/7/3勾一下预览
0 回复 -
rookie VIP0
2024/7/3赞~ 响应很快速!但生成的sql中where条件似乎没加上。。。
另外还有一个问题,就是sqlfunc中有些字段没有表前缀,比如
SqlFunc.CharIndexNew(n.jgpath, "/") > 0 ? SqlFunc.Substring(n.jgpath, 0, SqlFunc.CharIndexNew(n.jgpath, "/") - 1) : n.jgpath
这个生成的sql变成了
( CASE WHEN ((strpos ("jgpath",N'/')) > 0 ) THEN SUBSTRING("jgpath",1 + 0,((strpos ("jgpath",N'/')) - 1 )) ELSE "n"."jgpath" END )
这样如果几个表中都有jgpath字段就会出现歧义了,strpos函数中的jgpath 缺少了表前缀
0 回复 -
rookie VIP0
2024/7/3另外,联表更新其实应该也是支持left join 的,但现在框架似乎只有inner join支持。是否也可以支持下呢
0 回复 -
fate sta VIP0
2024/7/4SqlSugarCore 5.1.4.161-preview11
已修复
0 回复 -
rookie VIP0
2024/7/4可以了,where 条件加上了。(问题1已解决)
那另外说那个SqlFunc 函数表前缀的问题要处理下吗?(问题2)
0 回复 -
fate sta VIP0
2024/7/4@rookie:我测试前缀有了
0 回复 -
fate sta VIP0
2024/7/40 回复 -
rookie VIP0
2024/7/4奇怪,我这确实没有呢,和原来一样还是只有ELSE中有,SqlFunc 里的引用都没有
SqlFunc.CharIndexNew(n.jgpath, "/") > 0 ? SqlFunc.Substring(n.jgpath, 0, SqlFunc.CharIndexNew(n.jgpath, "/") - 1) : n.jgpath
=>
( CASE WHEN ((strpos ("jgpath",N'/')) > 0 ) THEN SUBSTRING("jgpath",1 + 0,((strpos ("jgpath",N'/')) - 1 )) ELSE "n"."jgpath" END )
然后我又更新了一下,确定引用的是 5.1.4.161-preview11 版本,那还有可能会是哪里的问题呢?
0 回复 -
fate sta VIP0
2024/7/4写个完整DEMO吧,不需要库能重现的,删掉OBJ和BIN上传。
0 回复 -
fate sta VIP0
2024/7/4我用的是PGSQL测试的
0 回复 -
fate sta VIP0
2024/7/4理论上不影响
0 回复 -
rookie VIP0
2024/7/4sugarClient.Updateable<QcpDqkh>()
.InnerJoin<CustomerAll>((q, c) => q.客户号 == c.Cuid)
.InnerJoin<CommonUser>((q, c, u) => c.workno == u.Workno)
.InnerJoin<Network>((q, c, u, n) => c.Networkno == n.Networkno)
.SetColumns((q, c, u, n) => new QcpDqkh()
{
网点 = SqlFunc.CharIndexNew(n.jgpath, "/") > 0 ? SqlFunc.Substring(n.jgpath, 0, SqlFunc.CharIndexNew(n.jgpath, "/") - 1) : n.jgpath
})
.Where((q, c, u, n) => q.数据日期 == DateTime.Now)
.ExecuteCommand();
我又测试了一下,目前这样是因为我两个表 u 和 n 中都有jgpath 这个字段,如果我把最后join的 n 表去掉,生成的就带有前缀,如下
sugarClient.Updateable<QcpDqkh>()
.InnerJoin<CustomerAll>((q, c) => q.客户号 == c.Cuid)
.InnerJoin<CommonUser>((q, c, u) => c.workno == u.Workno)
.SetColumns((q, c, u) => new QcpDqkh()
{
网点 = SqlFunc.CharIndexNew(u.jgpath, "/") > 0 ? SqlFunc.Substring(u.jgpath, 0, SqlFunc.CharIndexNew(u.jgpath, "/") - 1) : u.jgpath
})
.Where((q, c, u) => q.数据日期 == DateTime.Now)
.ExecuteCommand();
生成的就是正常带前缀的sql =>
( CASE WHEN ((strpos ("u"."bankpath",N'/')) > 0 ) THEN SUBSTRING("u"."bankpath",1 + 0,((strpos ("u"."bankpath",N'/')) - 1 )) ELSE "u"."bankpath" END )
所有应该还是跟重名有关吧?
0 回复 -
fate sta VIP0
2024/7/4@rookie:给个DEMO吧
0 回复 -
fate sta VIP0
2024/7/4五个类一串代码。能重现就行
0 回复 -
rookie VIP0
2024/7/40 回复 -
fate sta VIP0
2024/7/4找到原因了,你这个是重载不同。。
0 回复 -
fate stay night VIP0
2024/7/4SqlSugarCore 5.1.4.161-preview13
已修复
0 回复 -
rookie VIP0
2024/7/4可以了
0 回复