Oracle的start with connect by prior是根据条件递归查询”树”,分为四种使用情况:
第一种:start with 子节点ID='n' connect by prior 子节点ID = 父节点ID
查询结果为自己(子ID为n)所有的后代节点(包括自己)。
第二种:start with 子节点ID='n' connect by 子节点ID = prior 父节点ID
查询结果为自己(子ID为n)所有的前代节点(包括自己)。
第三种:start with 父节点ID='n' connect by prior 子节点ID = 父节点ID
查询结果为自己(父ID为n,可能有多个)所有的后代节点(包括自己)。
第四种:start with 父节点ID='n' connect by 子节点ID = prior 父节点ID
查询结果为自己(父ID为n,可能有多个)的所有的前代节点(包括自己)。
注意子ID不会重复,但父ID会重复!注意包括自己这个词!
如select * from t_menu t start with t.menu_id = '1' connect by t.parent_id = prior t.menu_id这条SQL, 逻辑为:首先找到menu_id为1的记录,接着查找parent_id等于上一条记录(首先找到的记录)的menu_id的记录,接着对找到的记录重复这个过程。
如果有where 条件,执行顺序为先执行start with connect by prior,然后再按照where条件进行过滤。
1
select * from mdm_organization o where 条件 startwith o.org_parent_code='10000008'connectby o.org_code = prior o.org_parent_code<br>
MERGEINTO [your table-name] [rename your table here] USING ( [write your query here] )[rename your query-sqlandusing just like a table] ON ([conditional expression here] AND [...]...) WHENMATCHEDTHEN [here you can executesomeupdatesqlor something else ] WHENNOTMATCHEDTHEN [execute something else here ! ]
示例:
1 2 3 4
MERGEINTOTEST T1 USING (SELECT'2'asID, 'newtest2'asNAMEFROM dual) T2 on (T1.ID=T2.ID) WHENMATCHEDTHENUPDATESET T1.NAME=T2.NAME WHENNOTMATCHEDTHENINSERT (T1.ID, T1.NAME) VALUES (T2.ID, T2.NAME );
merge into在更新后还可以执行删除
with as
1 2 3
--相当于建了个e临时表 with e as (select * from scott.emp e where e.empno=7499) select * from e;
select * from ( select /*+ first_rows */ rownum rn,a.object_name from page_test a, page_test b, page_test c where a.id=b.id and b.id=c.id and rownum<=5 ) where rn>0;
分页
无ORDER BY排序的写法:
1 2 3 4 5 6 7
SELECT * FROM (SELECT ROWNUM AS rowno, t.* FROM emp t WHERE hire_date BETWEEN TO_DATE ('20060501', 'yyyymmdd') AND TO_DATE ('20060731', 'yyyymmdd') AND ROWNUM <= 20) table_alias WHERE table_alias.rowno >= 10;
有ORDER BY排序的写法:
1 2 3 4 5 6 7 8 9
SELECT * FROM (SELECT tt.*, ROWNUM AS rowno FROM ( SELECT t.* FROM emp t WHERE hire_date BETWEEN TO_DATE ('20060501', 'yyyymmdd') AND TO_DATE ('20060731', 'yyyymmdd') ORDER BY create_time DESC, emp_no) tt WHERE ROWNUM <= 20) table_alias WHERE table_alias.rowno >= 10;
exists & in
1、select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;