当前位置: 首页 > news >正文

北京城乡建设厅网站搜索引擎官网

北京城乡建设厅网站,搜索引擎官网,聊城做网站公司信息,企业网站制作费做分录在这样一个场景,我 left join 了很多张表,用这些表的不同列来过滤,看起来非常合理 但是出现的问题是 left join 其中一张或多张表出现了笛卡尔积,且无法消除 FUNCTION fun_get_xxx_helper(v_param_1 VARCHAR2,v_param_2 VARCHAR2…

在这样一个场景,我 left join 了很多张表,用这些表的不同列来过滤,看起来非常合理
但是出现的问题是 left join 其中一张或多张表出现了笛卡尔积,且无法消除

FUNCTION fun_get_xxx_helper(v_param_1 VARCHAR2,v_param_2 VARCHAR2,v_param_3 VARCHAR2) 
RETURN t_xxx_tab pipelined 
ASv_cur t_xxx_cur;v_rec v_cur%ROWTYPE;
BEGINOPEN v_cur FORSELECT R.*FROM (SELECT one.colum_1,one.colum_2,three.colum_1,two.colum_1FROM table_one oneLEFT JOIN table_two two ON one.colum_1= two.colum_1LEFT JOIN table_three three ON one.colum_1= three.colum_1-- left join table_four 是为了用它其中一列作为过滤条件,但是会产生笛卡尔积,且无法消除LEFT JOIN table_four four ON one.colum_1= four.colum_1 WHERE (v_param_1 is not null AND one.colum_1= v_param_1 ) AND(v_param_2 is null or two.colum_2 = v_param_2 ) AND-- 在这里用到了 table_four.colum_3 作为过滤条件(v_param_3 is null or four.colum_3 = v_param_3 ))R-- 输出部分LOOPFETCH v_cur INTO v_rec;EXIT WHEN v_cur%notfound;PIPE ROW (v_rec);END LOOP;
END fun_get_xxx_helper;

这个时候可以把原本会产生笛卡尔积的那张表先舍弃掉,把它放在外层 select 的 where 子句中,以子查询的方式实现过滤

改良后:

FUNCTION fun_get_xxx_helper(v_param_1 VARCHAR2,v_param_2 VARCHAR2,v_param_3 VARCHAR2) 
RETURN t_xxx_tab pipelined 
ASv_cur t_xxx_cur;v_rec v_cur%ROWTYPE;
BEGINOPEN v_cur FORSELECT R.*FROM (SELECT one.colum_1 id,one.colum_2 name,three.colum_1 age,two.colum_1 genderFROM table_one oneLEFT JOIN table_two two ON one.colum_1= two.colum_1LEFT JOIN table_three three ON one.colum_1= three.colum_1WHERE (v_param_1 is not null AND one.colum_1= v_param_1 ) AND(v_param_2 is null or two.colum_2 = v_param_2 ))RWHERE v_param_3 is null OR( EXISTS ( SELECT 1FROM table_four fourWHERE four.colum_1= R.id AND four.colum_3  = v_param_3 ))-- 输出部分LOOPFETCH v_cur INTO v_rec;EXIT WHEN v_cur%notfound;PIPE ROW (v_rec);END LOOP;
END fun_get_xxx_helper;

在里层 select 中先把前面的过滤做了,然后在外层的 select 的 where 子句中过滤
v_param_3null则不过滤,不为空则用EXISTS ()函数配合select 1子查询来做过滤
R.idv_param_3作为过滤条件查询table_four中是否有此数据,若有则保留里层R.id对应的那条数据,没有则将其过滤掉;

  1. select 1表示当含有满足条件的时候返回一个常量 1,可以看作一条 record
  2. EXISTS是SQL中的一个逻辑运算符,通常用于检查子查询中的行是否存在;
    EXISTS (subquery)它根据子查询是否返回任何行返回一个布尔值,如果子查询至少返回一行,则返回结果为True,子查询没有返回任何行,则返回结果为False
    通常与WHEREHAVING子句配合使用,有条件地过滤或连接数据;
    =================================================================
    例如,在执行删除或更新数据之前,可以使用EXISTS检查相关表中是否存在这条记录:
    DELETE FROM table_name
    WHERE EXISTS (SELECT 1 FROM related_table WHERE related_table.id = table_name.id);
    
http://www.yidumall.com/news/96695.html

相关文章:

  • wordpress在线问答插件百度网站排名优化价格
  • 公司网站建设技术方案手机百度网页版
  • 施工企业费用预算的编制的内容包括哪些专业关键词优化平台
  • 动态网站开发 lank百度扫一扫
  • 政府网站建设的创新机制成品网站源码
  • 百度网站收录提交入口全攻略百度一下搜索
  • 衡水提供网站设计公司哪家专业seo网站排名厂商定制
  • 网站运营策划提案比百度好用的搜索引擎
  • 怎么做网站底部备案号sem数据分析
  • 网站制作方案设计线下推广方法及策略
  • 网站代理游戏杭州今天查出多少阳性
  • 215做网站谷歌sem
  • 展览展示设计必看网站网站分析报告
  • 厦门网站推广费用中国唯一没有疫情的地方
  • 做个小网站大概多少钱sem培训机构
  • 哪里有做网站技术治疗腰椎间盘突出的特效药
  • 手机微信可以做网站吗产品推广网站哪个好
  • 静态网站怎么样百度一下官网
  • 公司网站空间域名建设线上引流线下推广方案
  • 那个网站做玉石最专业企业网站建设的一般要素
  • 网站策划编辑招聘网盘资源大全
  • 网站优化外包公司系统优化软件排行榜
  • 网站建设设计师招募人工智能培训机构
  • 昆明做网站优化价格百度收录入口提交查询
  • 17网站一起做网店类似的app网络推广方案
  • wordpress隐藏自定义网站优化排名软件
  • 网址域名ip解析上海百度seo牛巨微
  • vip解析网站如何做星乐seo网站关键词排名优化
  • 番禺做网站开发个人主页网页设计模板
  • 网站开发建设的步骤流感用什么药最好