Thinkphp6中union在oracle数据的使用

thinkphp6使用union的话,可以直接union('select .....'),也可以先使用buildsql()来构造子查询,然后使用union做合并表查询。经验证基于oracle的数据库,thinkphp6 的union不生效,是因为Oracle的数据库链接模板里,缺少了union的关键字替换,需要修改vendor\topthink\think-orm\src\db\builder\Oracle.php,在%HAVING%后面增加个%UNION%就可以了。

一、buildsql()构造子查询

构造子查询之后,在执行的时候,出现了ORA-00918报错。原因是TP生成的oracle查询语句,会带上numrow,子查询的numrow和执行子查询的numrow出现字段的重复,通过使用field进行字段过滤即可。

错误的代码:

//没做字段过滤
$sqlOne = Db::connect('ora')->name('data.t_one')->limit(5)->buildSql();

$data = Db::connect('ora')->table($sqlOne. ' a')->select();
-- 查询语句中numrow字段出现重复
SELECT * FROM (SELECT thinkphp.*, rownum AS numrow FROM (SELECT * FROM ( SELECT * FROM (SELECT thinkphp.*, rownum AS numrow FROM (SELECT id,xm,'一区' as qy FROM data.t_one) thinkphp ) WHERE (numrow>0 AND numrow<=5) ) a) thinkphp )

增加字段过滤即可正确执行:

//没做字段过滤
$fieldsOne = "id,xm,'1区' as qy";
$sqlOne = Db::connect('ora')->name('data.t_one')->field($fieldsOne)->limit(5)->buildSql();
$fieldsQy = "id,xm,qy";
$data = Db::connect('ora')->table($sqlOne . ' a')->field($fieldsQy)->select();
-- 子查询中numrow字段在最终的结果集中过滤掉了

SELECT * FROM (SELECT thinkphp.*, rownum AS numrow FROM (SELECT id,xm,qy FROM ( SELECT * FROM (SELECT thinkphp.*, rownum AS numrow FROM (SELECT id,xm,'一区' as qy FROM data.t_one) thinkphp ) WHERE (numrow>0 AND numrow<=5) )) thinkphp ) 

 二、使用thinkphp的union

默认thinkphp6的oralce数据库连接存在问题,模板缺少union关键字的替换。生成的查询语句,只有sqlTwo,没有union的部分。结果集也只有sqlTwo的结果集。需要修改vendor\topthink\think-orm\src\db\builder\Oracle.php,在%HAVING%后面增加个%UNION%就可以了

//没做字段过滤
$fieldsOne = "id,xm,'1区' as qy";
$sqlOne = Db::connect('ora')->name('data.t_one')->field($fieldsOne)->limit(5)->buildSql();


$fieldsTwo = "id,xm,'2区' as qy";
$sqlTwo = Db::connect('ora')->name('data.t_two')->field($fieldsTwo )->limit(5)->buildSql();


$fieldsQy = "id,xm,qy";
$data = Db::connect('ora')->table($sqlTwo)->field($fieldsQy)->unionAll($sqlOne )->select();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值