Content:
Where条件中的与或
在Where条件中对子查询进行and和or逻辑的替代方式。因为and和or不支持这样用。
SELECT 'exist' FROM dual WHERE EXISTS ( SELECT 1 FROM dual UNION ( SELECT 2 FROM dual INTERSECT SELECT 2 FROM dual ) ); |
临时数据或变量
使用with as语句存储临时数据或变量
WITH temp1 AS ( SELECT 'a' AS col1, 'b' AS col2 ,'c' AS col3 FROM dual ) SELECT 'exist' FROM dual WHERE EXISTS ( SELECT 1 FROM temp1 WHERE col1 = 'b' UNION ( SELECT 2 FROM temp1 WHERE col2 = 'b' INTERSECT SELECT 2 FROM temp1 WHERE col3 = 'c' ) ); |
多表插入
在Oracle数据库中,单SQL对多表进行插入,且多表中有外键引用。
例如:
现在有两个表,学生表student和学生所在班表student_class,所在班表会引用学生表的主键id(s_num_id)。
学生学号从SN001到SN005分配到班级Class A,学生学号从SN006到SN010分配到班级Class B。
因为insert all语句中不能使用序列,所以必须采用extractvalue(dbms_xmlgen.getxmltype(绕过去。
INSERT ALL WHEN 1 = 1 THEN INTO student (id, s_num) VALUES (num_id, num) WHEN 2 > 0 THEN INTO student_class (id, s_num_id, s_class_name ) VALUES (student_class_id, num_id, class_name ) WITH temp (num, class_name) AS ( SELECT regexp_replace( to_char(level,'FM000'),'([0-9]{3})', 'SN\1'), 'Class A' FROM dual WHERE level >= 001 CONNECT BY level <=005 SELECT regexp_replace( to_char(level,'FM000'),'([0-9]{3})', 'SN\1'), 'Class B' FROM dual WHERE level >= 006 CONNECT BY level <=010 ) SELECT rownum, extractvalue(dbms_xmlgen.getxmltype('select STUDENT_SEQ.nextval from dual'),'//text()') AS num_id, extractvalue(dbms_xmlgen.getxmltype('select STUDENT_CLASS_SEQ.nextval from dual'),'//text()') AS student_class_id, num, class_name FROM temp; |
最后两表产生的数据如下:
student student_class id s_num id s_num_id s_class_name 1 'SN001' 31 1 'Class A' 2 'SN002' 32 2 'Class A' 3 'SN003' 33 3 'Class A' 4 'SN004' 34 4 'Class A' 5 'SN005' 35 5 'Class A' 6 'SN006' 36 6 'Class B' 7 'SN007' 37 7 'Class B' 8 'SN008' 38 8 'Class B' 9 'SN009' 39 9 'Class B' 10 'SN010' 40 10 'Class B' |
Query Plan查询
先根据SQL里面的关键字查到sql_id,然后通过第二句传入sql_id得到plan。
SELECT hash_value, sql_id,child_number,address,sql_text,is_reoptimizable FROM v$sql WHERE sql_text LIKE '%aaaaa%'; SELECT * FROM TABLE(dbms_xplan.display_cursor('bcyctu75fnav4',NULL,'ADVANCED')); |
本作品采用知识共享署名 4.0 国际许可协议进行许可。