left join on与带括号的加号的区别

本文详细解释了外连接的概念,包括左外连接和右外连接,并提供了Oracle数据库中的具体应用实例,对比了传统(+)符号与现代FULL JOIN语法的区别。
部署运行你感兴趣的模型镜像
外连接:
除了显示匹配相等连接条件的数据外,还可以显示某一个表中无法匹配相等连接条件的记录!
------------------------------------------------
1) 左条件(+) = 右条件
左条件所在的表必须严格进行相等连接条件的匹配,而右条件所在的表除了匹配相等连接条件外,还可以显示无法匹配连接条件的数据!
也称为右外连接.
--------------------------------
可以用下列语句取代:
SELECT...FROM 表1 RIGHT OUTER JOIN 表2 ON 条件;
2) 左条件 = 右条件(+)
右条件所在的表必须严格进行相等连接条件的匹配,而左条件所在的表除了匹配相等连接条件外,还可以显示无法匹配连接条件的数据!
也称为左外连接.
--------------------------------
可以用下列语句取代:
SELECT...FROM 表1 LEFT OUTER JOIN 表2 ON 条件;


Oracle 建议你用在From语句后用Outer Join语法 而不是Oracle的Join操作符(+).而且(+)是要受下面的规则限制的,但Outer Join语法则不受的~~

1)你不可以在查询块中使用(+) 当它同时包含 join的from语句中
2)(+)只是在where语句中,并且只能对应一个表或视图的一行字段
3)如果A和B做联接时有多个条件,那么(+)必须完善所有的匹配条件,
如果没有 ,oracle不会警告你~只是结果自然不同的
4)不可以在作出一个表外查询 另张表内查询的(+)联接操作~~
5)不可以用(+)外联接到自己 当然Self Join是可以的
6)含(+)的Where后的注意
OR不可用
IN不可用
子查询不可用

以下给些个例子:


SQL> desc part

Name Null? Type
----------------------------------------- -------- -----------------
PART_ID NOT NULL VARCHAR2(4)
SUPPLIER_ID VARCHAR2(4)

SQL> select * from part;

PART SUPP
---- ----
P1 S1
P2 S2
P3
P4

SQL> desc supplier

Name Null? Type
----------------------------------------- -------- -----------------
SUPPLIER_ID NOT NULL VARCHAR2(4)
SUPPLIER_NAME NOT NULL VARCHAR2(20)

SQL> select * from supplier;

SUPP SUPPLIER_NAME
---- --------------------
S1 Supplier#1
S2 Supplier#2
S3 Supplier#3


SQL> select p.part_id, s.supplier_name
2 from part p, supplier s
3 where p.supplier_id = s.supplier_id (+);

PART SUPPLIER_NAME
---- --------------------
P1 Supplier#1
P2 Supplier#2
P3
P4

--(+)是单向的

SQL> select p.part_id, s.supplier_name
2 from part p, supplier s
3 where p.supplier_id (+) = s.supplier_id (+);
where p.supplier_id (+) = s.supplier_id (+)
*
ERROR at line 3:
ORA-01468: a predicate may reference only one outer-joined table

--实现Full Join的方法

SQL> select p.part_id, s.supplier_name
2 from part p, supplier s
3 where p.supplier_id = s.supplier_id (+)
4 union
5 select p.part_id, s.supplier_name
6 from part p, supplier s
7 where p.supplier_id (+) = s.supplier_id;

PART SUPPLIER_NAME
---- --------------------
P1 Supplier#1
P2 Supplier#2
P3
P4
Supplier#3

--现在的语法
SQL> select p.part_id, s.supplier_name
2 from part p full outer join supplier s
3 on p.supplier_id = s.supplier_id;

PART SUPPLIER_NAME
---- --------------------
P1 Supplier#1
P2 Supplier#2
P4
P3
Supplier#3


另外的EG:


SQL code
SQL> select * from testa;

ID NAME ADDR AGE
---------- ------ ------ ----------
3 电子 南京 23
5 物理 北京 23
6 物理 河北 25
1 电脑 上海 23
2 电子 北京 22
4 物理 芜湖 22
7 艺术 上海 21
8 歌剧 苏州 16
9 沈亮 上海 22

已选择9行。

SQL> select * from testb;

ID ADDR
---------- ----------
7 上海
1 北京
3 上海
5 合肥
--匹配完全
select testa.id,testa.addr from testa,testb where testa.id(+)=testb.id and
testa.addr(+)=testb.addr;

ID ADDR
---------- ------
7 上海


现在的Outer Join方法是Oracle9i时开始引用的 ANSI标准的联接语法,现在的则比较直观 简单
通过上边Full Join的实现方式 不难看到ANSI的联接语法要比用含Union的(+)的执行效率更高

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

"select t1.id IMID ,t1.APPLYPERSON APPLYPERSON1,t3.*,t2.id demandid,to_char(t3.CHECKTIME,'yyyy-mm-dd hh24:mi:ss') CHECKTIME1," + " t4.NOTICEPERSON, t4.NOTICEPERSONID," + " t1.MATERIELCODE imMATERIELCODE,t1.MATERIELNAME imMATERIELNAME,t1.QUANT imQUANT," + "t1.UNIVALENCE imUNIVALENCE,t1.TOTALPRICE imTOTALPRICE,t1.SUPPLIERNAME imSUPPLIERNAME," + "t1.PRODUCTCODE imPRODUCTCODE,t1.MATERIELUNIT imMATERIELUNIT,t1.MANUFACTURERNAME imMANUFACTURERNAME," + "t1.DEMANDDEPT imDEMANDDEPT,t1.DEMANDDEPTID imDEMANDDEPTID,t1.APPLYPERSON imAPPLYPERSON," + "t1.APPLYPERSONID imAPPLYPERSONID,t1.DEMANDREMARK imDEMANDREMARK,t1.VALIDDATE imVALIDDATE," + "t1.PRODUCTDATE imPRODUCTDATE,t1.REGNAME imREGNAME,t1.MATERIELTYPE imMATERIELTYPE,t1.ZJM imZJM," + "t1.CPMC imCPMC,t1.MINPACKNUM imMINPACKNUM,t1.MINPACKUNIT imMINPACKUNIT," + "t1.OPTTIME imOPTTIME,t1.OPTDW imOPTDW," + "t1.OPTDWID imOPTDWID,t1.OPTDEPT imOPTDDEPT,t1.OPTDEPTID imOPTDEPTID,t1.OPTPERSON imOPTPERSON," + "t1.OPTPERSONID imOPTPERSONID, " + " p.INPATIENT_NO,p.OPERATION_ID,p.PATIENT_NO,p.JFDEPTID IMJFDEPTID ,p.JFDEPT IMJFDEPT ," + " p.JFUSERID IMJFUSERID,p.JFUSER IMJFUSER, t1.yyid YYID,p.patientcode patientcode,p.XHORDERID,t1.ynm,t3.SECONDNAME,t5.ISCHARGE WZISCHARGE,t5.ISJICAI ISJICAI " + " from gk_wz_inpatient_material t1 " + " left join GK_WZ_YJZFPC_BH t3 on t3.id=t1.PCID " + " left join gk_wz_demand_bh t2 on t2.id = t1.DEMANDID " + " left join GK_WZ_ORDER_BH t4 on t4.id = t2.ORDERCODE " + " left join GK_WZ_HIS_PATIENT p on t1.patientid = p.id " + " left join gk_wz_materiel t5 on t3.MATERIELCODE = t5.MATERIELCODE and t1.OPTDWID=t5.OPTDWID " + " where t1.PATIENTID = ? and t1.OPTDWID去除“”+生成sql
11-12
帮我检查这段脚本是否符合帆软报表的语句标准:SELECT A.adjust_code, A.adjust_amount, B.dept_name, A.create_user, C.name, A.create_date, A.acct_year, D.after_wb_value, (CASE A.state WHEN '0' THEN '新建' WHEN '1' THEN '审核中' ELSE '已审核' END) STATE, (CASE A.budg_type WHEN '01' THEN '业务预算' WHEN '02' THEN '收入预算' WHEN '03' THEN '支出预算' ELSE '支出(项目)预算' END) BUDG_TYPE, (CASE A.adjust_type_code WHEN 'BUDG_ADJUST_ADD_4' THEN '项目追加预算' WHEN 'BUDG_ADJUST_ADD_2' THEN '事项追加预算' ELSE '年中调整' END) ADJUST_TYPE_CODE, B1.dept_name AS '归口科室', E.proj_name, F.item_detail_name, G.detail_name, D.adjust_value, D.final_value, D.after_value, D.explain, -- [嵌入点] 添加资金来源逻辑,基于budg_dept_detail_adjust表(别名D)的adjust_budget_字段 CASE WHEN D.adjust_budget_01 IS NOT NULL AND D.adjust_budget_01 <> 0 THEN '医院自筹' WHEN D.adjust_budget_02 IS NOT NULL AND D.adjust_budget_02 <> 0 THEN '财政项目资金拨款' WHEN D.adjust_budget_03 IS NOT NULL AND D.adjust_budget_03 <> 0 THEN '科研资金' WHEN D.adjust_budget_04 IS NOT NULL AND D.adjust_budget_04 <> 0 THEN '教学资金' WHEN D.adjust_budget_05 IS NOT NULL AND D.adjust_budget_05 <> 0 THEN '财政基本拨款资金' ELSE NULL -- 所有条件不满足时,资金来源为空 END AS '资金来源', -- 新列别名 ISNULL(AT.name_, '流程已结束') AS task_name, A.adjust_type_code, * -- 保留*以选择所有剩余列 FROM budg_dept_adjust A LEFT JOIN budg_dept_detail_adjust D ON A.id = D.main_id -- D是budg_dept_detail_adjust的别名,逻辑在此表上应用 LEFT JOIN SYS_DEPT B ON A.dept_id = B.dept_id LEFT JOIN SYS_DEPT B1 ON A.mana_dept_id = B1.dept_id LEFT JOIN up_org_user C ON A.create_user = C.account LEFT JOIN budg_project E ON D.item_id = E.proj_id LEFT JOIN budg_item_detail F ON F.id = D.item_detail_id LEFT JOIN SYS_BUDG_DETAIL G ON D.detail_id = G.detail_id INNER JOIN rt_workflow_vadp_mapping rm ON A.id = rm.bus_key AND rm.type_code = 'BUDG_ADJUST_DYN' LEFT JOIN (SELECT DISTINCT name_, proc_inst_id_ FROM act_ru_task) AT ON rm.work_inst_id = AT.proc_inst_id_; -- 注意别名AT大小写一致 where A.create_date between '${be_date}' and '${end_date}' ${if(len(年度)==0,""," AND A.acct_year='"+年度+"'")} ${if(len(调整单号)==0,""," AND A.adjust_code like '%"+调整单号+"%'")} ${if(len(预算类型)==0,""," AND A.budg_type in ('"+预算类型+"')")} ${if(len(发起科室)==0,""," AND B.dept_id in ('"+发起科室+"')")} ${if(len(归口科室)==0,""," AND A.mana_dept_id in ('"+归口科室+"')")} ${if(len(项目)==0,""," AND E.proj_name like '%"+项目+"%'")} ${if(len(调整类型)==0,""," AND A.adjust_type_code in ('"+调整类型+"')")} ${if(len(资金来源)==0,""," AND '资金来源' in ('"+资金来源+"')")}
10-11
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值