find_table_differences.sql
CREATE TABLE dept_copy (deptno, dname, loc) AS
SELECT * FROM dept WHERE deptno = 10
UNION
SELECT deptno, dname, loc || ' changed' FROM dept WHERE deptno = 20
UNION
SELECT 50, 'MARKETING', 'DUBLIN' FROM dual;
SELECT 'dept' AS source, d.*
FROM dept d
MINUS
SELECT 'dept', dc.*
FROM dept_copy dc
UNION ALL
SELECT 'dept_copy', dc.*
FROM dept_copy dc
MINUS
SELECT 'dept_copy',d.*
FROM dept d
ORDER BY 2;
SELECT deptno, dname, loc, count(src1) cnt1, count(src2) cnt2
FROM (
SELECT d.*, 1 src1, to_number(null) src2
FROM dept d
UNION ALL
SELECT dc.*, to_number(null) src1, 1 src2
FROM dept_copy dc
) data
GROUP BY deptno, dname, loc
HAVING count(src1) != count(src2)
ORDER BY deptno;
DROP TABLE dept;
DROP TABLE dept_copy;
get_environment_details.sql
SELECT
sys_context('USERENV', 'CURRENT_USER'),
sys_context('USERENV', 'DB_DOMAIN'),
sys_context('USERENV', 'DB_NAME'),
sys_context('USERENV', 'DB_UNIQUE_NAME'),
sys_context('USERENV', 'HOST'),
sys_context('USERENV', 'INSTANCE_NAME'),
sys_context('USERENV', 'IP_ADDRESS'),
sys_context('USERENV', 'ISDBA'),
sys_context('USERENV', 'LANG'),
sys_context('USERENV', 'LANGUAGE'),
sys_context('USERENV', 'MODULE'),
sys_context('USERENV', 'NLS_CALENDAR'),
sys_context('USERENV', 'NLS_CURRENCY'),
sys_context('USERENV', 'NLS_DATE_FORMAT'),
sys_context('USERENV', 'NLS_DATE_LANGUAGE'),
sys_context('USERENV', 'NLS_SORT'),
sys_context('USERENV', 'NLS_TERRITORY'),
sys_context('USERENV', 'OS_USER'),
sys_context('USERENV', 'SERVER_HOST'),
sys_context('USERENV', 'SERVICE_NAME'),
sys_context('USERENV', 'SESSIONID'),
sys_context('USERENV', 'SID')
FROM dual;
SELECT
UTL_INADDR.get_host_name,
UTL_INADDR.get_host_address,
UTL_INADDR.get_host_name ('141.146.8.66'),
UTL_INADDR.get_host_address ('oracle.com')
FROM DUAL;
merge_tables.sql
CREATE TABLE dept_copy (deptno, dname, loc) AS
SELECT * FROM dept WHERE deptno = 10
UNION
SELECT deptno, dname, loc || ' changed' FROM dept WHERE deptno = 20
UNION
SELECT 50, 'MARKETING', 'DUBLIN' FROM dual;
MERGE INTO dept_copy dc
USING dept d ON (dc.deptno = d.deptno)
WHEN matched THEN
UPDATE SET dc.dname = d.dname,
dc.loc = d.loc
WHEN NOT matched THEN
INSERT VALUES(d.deptno, d.dname, d.loc);
COMMIT;
DELETE FROM dept_copy
WHERE deptno NOT IN (SELECT deptno FROM dept);
COMMIT;
DROP TABLE dept;
DROP TABLE dept_copy;
pivot_column_to_csv.sql
SELECT
deptno,
LTRIM(SYS_CONNECT_BY_PATH(ename, ','), ',') as employees
FROM (
SELECT deptno,
ename,
row_number() over(PARTITION BY deptno ORDER BY deptno) rn,
count(*) over(PARTITION BY deptno) cnt
FROM emp
)
WHERE rn=cnt
START WITH rn = 1
CONNECT BY PRIOR rn = rn -1 AND PRIOR deptno = deptno;
SELECT deptno,
LTRIM(MAX(SYS_CONNECT_BY_PATH(ename,','))
KEEP (DENSE_RANK LAST ORDER BY curr),',') AS employees
FROM (SELECT deptno,
ename,
ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY ename) AS curr,
ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY ename) -1 AS prev
FROM emp)
GROUP BY deptno
CONNECT BY prev = PRIOR curr AND deptno = PRIOR deptno
START WITH curr = 1;
SELECT deptno,
rtrim( xmlagg(xmlelement(c, ename || ',') ORDER BY ename).extract('//text()'), ',') as employees
FROM emp
GROUP BY deptno;
pivot_totals_using_case.sql
SELECT deptno,
SUM(CASE WHEN sal BETWEEN 0 AND 2000 THEN sal ELSE 0 END) low,
SUM(CASE WHEN sal BETWEEN 2001 AND 4000 THEN sal ELSE 0 END) medium,
SUM(CASE WHEN sal > 4000 THEN sal ELSE 0 END) high
FROM emp
GROUP BY deptno;
SELECT deptno,
SUM(CASE WHEN sal BETWEEN 0 AND 2000 THEN 1 ELSE 0 END) low,
SUM(CASE WHEN sal BETWEEN 2001 AND 4000 THEN 1 ELSE 0 END) medium,
SUM(CASE WHEN sal > 4000 THEN 1 ELSE 0 END) high
FROM emp
GROUP BY deptno;
update_one_table_from_another.sql
DROP TABLE dept_copy;
CREATE TABLE dept_copy (deptno, dname, loc) AS
SELECT deptno, dname || ' changed', loc || ' changed'
FROM dept WHERE deptno IN (30, 40)
UNION ALL
SELECT deptno + 100, dname, loc
FROM dept;
UPDATE dept_copy
SET (dname, loc) = (SELECT dname, loc
FROM dept
WHERE dept_copy.deptno = dept.deptno
AND dname LIKE 'S%');
ROLLBACK;
UPDATE dept_copy
SET (dname, loc) = (SELECT dname, loc
FROM dept
WHERE dept_copy.deptno = dept.deptno
AND dname LIKE 'S%')
WHERE deptno IN (SELECT deptno
FROM dept
WHERE dname LIKE 'S%');
COMMIT;
group_by.sql
SELECT deptno, job, sum(sal)
FROM emp
GROUP BY deptno, job;
SELECT deptno, job, sum(sal)
FROM emp
GROUP BY ROLLUP(deptno, job);
SELECT job, deptno, sum(sal)
FROM emp
GROUP BY CUBE(job, deptno);
SELECT job, deptno, sum(sal)
FROM emp
GROUP BY GROUPING SETS((job, deptno), ());
SELECT job, deptno, sum(sal)
FROM emp
GROUP BY GROUPING SETS((job, deptno), (job), ());
regular_expressions.sql
SELECT
REGEXP_SUBSTR(phone_number,'^[[:digit:]]*') area_code,
REGEXP_REPLACE(phone_number,'^[[:digit:]]*\.', null) remove_area_code
FROM employees;
sqldeveloper_gauge.sql
SELECT ename, 'SQLDEV:GAUGE:0:6000:2000:4000:' || sal AS salary
FROM emp;
subquery_factoring.sql
SELECT deptno, trunc(avg(sal)) as average, max(sal) AS maximum
FROM emp
GROUP BY deptno
ORDER BY deptno;
SELECT deptno
FROM (
SELECT deptno, trunc(avg(sal)) as average
FROM emp
GROUP BY deptno
)
WHERE average > ANY (SELECT max(sal)
FROM emp
GROUP BY deptno) ;
SELECT s1.deptno
FROM (
SELECT deptno, trunc(avg(sal)) as average
FROM emp
GROUP BY deptno
) s1
JOIN (
SELECT deptno, max(sal) as maximum
FROM emp
GROUP BY deptno
) s2 ON s1.average > s2.maximum ;
WITH summary AS
(SELECT deptno, trunc(avg(sal)) as average, max(sal) AS maximum
FROM emp
GROUP BY deptno)
SELECT deptno
FROM summary
WHERE average > ANY (SELECT maximum
FROM summary) ;
WITH summary AS
(SELECT deptno, trunc(avg(sal)) as average, max(sal) AS maximum
FROM emp
GROUP BY deptno)
SELECT s1.deptno
FROM summary s1
JOIN summary s2 ON s1.average > s2.maximum ;
%%_UserGuide_%%