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

SqlSugar 处理完成
22 173
该叫什么 rookie 发布于2周前
悬赏:0 飞吻

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

  • 应该不支持,联表更新超过2个表只有个别库支持

    0 回复
  • 后续会支持吗? 毕竟直接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 回复
  • @rookie:我支持一下

    0 回复
  • SqlSugarCore 5.1.4.161-preview10


    更新到最新预览版本已支持

    0 回复
  • 勾一下预览

    0 回复
  • 赞~ 响应很快速!但生成的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 回复
  • 另外,联表更新其实应该也是支持left join 的,但现在框架似乎只有inner join支持。是否也可以支持下呢

    0 回复
  • SqlSugarCore 5.1.4.161-preview11



    已修复

    0 回复
  • 可以了,where 条件加上了。(问题1已解决)

    那另外说那个SqlFunc 函数表前缀的问题要处理下吗?(问题2)

    0 回复
  • @rookie:我测试前缀有了

    0 回复
  • image.png

    0 回复
  • 奇怪,我这确实没有呢,和原来一样还是只有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 回复
  • 写个完整DEMO吧,不需要库能重现的,删掉OBJ和BIN上传。

    0 回复
  • 我用的是PGSQL测试的

    0 回复
  • 理论上不影响

    0 回复
  •          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()

                    {

                        网点 = 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 回复
  • @rookie:给个DEMO吧

    0 回复
  • 五个类一串代码。能重现就行

    0 回复
  • 0 回复
  • 找到原因了,你这个是重载不同。。

    0 回复
  • SqlSugarCore 5.1.4.161-preview13

    已修复

    0 回复
  • 可以了

    0 回复