SQL Design Patterns: Advanced SQL Programming Idioms
SQL Design Patterns: Advanced SQL Programming Idioms
A=B ?
B\A
A∩B
A\B
(A \ B) ∪ (B \ A)
(A ∪ B) \ (A ∩ B)
SQL Query
(
select * from A
minus
select * from B
) union all (
select * from B
minus
select * from A
)
Test
create table A as
select obj# id, name from
sys.obj$
where rownum < 100000;
create table B as
select obj# id, name from
sys.obj$
where rownum < 100010;
Execution Statistics
Anti Join Transformation
convert_set_to_join = true:
select * from A
where (col1,col2,…) not in (select
col1,col2,… from B)
union all
select * from B
where (col1,col2,…) not in (select
col1,col2,… from A)
Execution Statistics
Optimization continued…
CREATE INDEX A_id_name ON A(id, name);
CREATE INDEX B_id_name ON B(id, name);
_hash_join_enabled = false
_optimizer_sortmerge_join_enabled =
false
or
/*+ use_nl(@"SEL$74086987" A)
use_nl(@"SET$D8486D66" B)*/
Symmetric Difference via
Aggregation
select * from (
select id, name,
sum(case when src=1 then 1 else 0
end) cnt1,
sum(case when src=2 then 1 else 0
end) cnt2
from (
select id, name, 1 src from A
union all
select id, name, 2 src from B
) group by id, name
)where cnt1 <> cnt2
Execution Statistics
Equality checking via Aggregation
1. Is there any difference? (Boolean).
2. What are the rows that one table contains,
and the other doesn't?
|| orahash 512259
+
|| orahash 334382
+
|| orahash 592731
|| orahash +267629
=
1523431
Relational Division
ApplicantSkills
Name Language
JobApplicants
JobRequirements Steve SQL
Name
Language Pete Java
Steve
Pete
x SQL = Kate SQL
Java Steve Java
Kate
Pete SQL
Kate Java
Dividend, Divisor and Quotient
ApplicantSkills
Name Language
SQL JobRequirements
Steve
Language Name
Pete Java / SQL = ?
Kate
Kate SQL
Java
Kate Java
Remainder
Is it a common Pattern?
Not a basic operator in RA or SQL
Informally:
“Find job applicants who meet all job
requirements”
compare with:
“Find job applicants who meet at least one
job requirement”
Set Union Query
Given a set of sets, Sets
Pete Java
Kate SQL
Steve Java
Pete SQL
Kate Java
Implementation (2)
Applicants who are not qualified:
πName (
πName(ApplicantSkills) x JobRequirements
- ApplicantSkills
)
Implementation (3)
Final Query:
πName (ApplicantSkills) -
πName ( ApplicantSkills -
πName(ApplicantSkills) x JobRequirements
)
Implementation in SQL (1)
select distinct Name from ApplicantSkills
minus
select Name from (
select Name, Language from (
select Name from ApplicantSkills
), (
select Language from JobRequirements
)
minus
select Name, Language from ApplicantSkills
)
Implementation in SQL (2)
select distinct Name from ApplicantSkills i
where not exists (
select * from JobRequirements ii
where not exists (
select * from ApplicantSkills iii
where iii.Language = ii.Language
and iii.Name = i.Name
)
)
Implementation in SQL (3)
“Name the applicants such that for all job
requirements there exists a corresponding entry
in the applicant skills”
“Name the applicants such that there is no job
requirement such that there doesn’t exists a
corresponding entry in the applicant skills”
“Name the applicants for which the set of all job
skills is a subset of their skills”
Implementation in SQL (4)
select distinct Name from ApplicantSkills i
where
(select Language from JobRequirements ii
where ii.Name = i.Name)
in
(select Language from ApplicantSkills)
Implementation in SQL (5)
A⊆B A\B=∅
select distinct Name from ApplicantSkills i
where not exists (
select Language from ApplicantSkills
minus
select Language from JobRequirements ii
where ii.Name = i.Name
)
Implementation in SQL (6)
select Name from ApplicantSkills s,
JobRequirements r
where s.Language = r.Language
group by Name
having count(*) = (select count(*) from
JobRequirements)
Book