Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
-- Tests aggregate expressions in outer query and EXISTS subquery.

CREATE TEMPORARY VIEW EMP AS SELECT * FROM VALUES
(100, "emp 1", date "2005-01-01", 100.00D, 10),
(100, "emp 1", date "2005-01-01", 100.00D, 10),
(200, "emp 2", date "2003-01-01", 200.00D, 10),
(300, "emp 3", date "2002-01-01", 300.00D, 20),
(400, "emp 4", date "2005-01-01", 400.00D, 30),
(500, "emp 5", date "2001-01-01", 400.00D, NULL),
(600, "emp 6 - no dept", date "2001-01-01", 400.00D, 100),
(700, "emp 7", date "2010-01-01", 400.00D, 100),
(800, "emp 8", date "2016-01-01", 150.00D, 70)
AS EMP(id, emp_name, hiredate, salary, dept_id);

CREATE TEMPORARY VIEW DEPT AS SELECT * FROM VALUES
(10, "dept 1", "CA"),
(20, "dept 2", "NY"),
(30, "dept 3", "TX"),
(40, "dept 4 - unassigned", "OR"),
(50, "dept 5 - unassigned", "NJ"),
(70, "dept 7", "FL")
AS DEPT(dept_id, dept_name, state);

CREATE TEMPORARY VIEW BONUS AS SELECT * FROM VALUES
("emp 1", 10.00D),
("emp 1", 20.00D),
("emp 2", 300.00D),
("emp 2", 100.00D),
("emp 3", 300.00D),
("emp 4", 100.00D),
("emp 5", 1000.00D),
("emp 6 - no dept", 500.00D)
AS BONUS(emp_name, bonus_amt);

-- Aggregate in outer query block.
-- TC.01.01
SELECT emp.dept_id,
avg(salary),
sum(salary)
FROM emp
WHERE EXISTS (SELECT state
FROM dept
WHERE dept.dept_id = emp.dept_id)
GROUP BY dept_id;

-- Aggregate in inner/subquery block
-- TC.01.02
SELECT emp_name
FROM emp
WHERE EXISTS (SELECT max(dept.dept_id) a
FROM dept
WHERE dept.dept_id = emp.dept_id
GROUP BY dept.dept_id);

-- Aggregate expression in both outer and inner query block.
-- TC.01.03
SELECT count(*)
FROM emp
WHERE EXISTS (SELECT max(dept.dept_id) a
FROM dept
WHERE dept.dept_id = emp.dept_id
GROUP BY dept.dept_id);

-- Nested exists with aggregate expression in inner most query block.
-- TC.01.04
SELECT *
FROM bonus
WHERE EXISTS (SELECT 1
FROM emp
WHERE emp.emp_name = bonus.emp_name
AND EXISTS (SELECT max(dept.dept_id)
FROM dept
WHERE emp.dept_id = dept.dept_id
GROUP BY dept.dept_id));

-- Not exists with Aggregate expression in outer
-- TC.01.05
SELECT emp.dept_id,
Avg(salary),
Sum(salary)
FROM emp
WHERE NOT EXISTS (SELECT state
FROM dept
WHERE dept.dept_id = emp.dept_id)
GROUP BY dept_id;

-- Not exists with Aggregate expression in subquery block
-- TC.01.06
SELECT emp_name
FROM emp
WHERE NOT EXISTS (SELECT max(dept.dept_id) a
FROM dept
WHERE dept.dept_id = emp.dept_id
GROUP BY dept.dept_id);

-- Not exists with Aggregate expression in outer and subquery block
-- TC.01.07
SELECT count(*)
FROM emp
WHERE NOT EXISTS (SELECT max(dept.dept_id) a
FROM dept
WHERE dept.dept_id = emp.dept_id
GROUP BY dept.dept_id);

-- Nested not exists and exists with aggregate expression in inner most query block.
-- TC.01.08
SELECT *
FROM bonus
WHERE NOT EXISTS (SELECT 1
FROM emp
WHERE emp.emp_name = bonus.emp_name
AND EXISTS (SELECT Max(dept.dept_id)
FROM dept
WHERE emp.dept_id = dept.dept_id
GROUP BY dept.dept_id));
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
-- Tests HAVING clause in subquery.

CREATE TEMPORARY VIEW EMP AS SELECT * FROM VALUES
(100, "emp 1", date "2005-01-01", 100.00D, 10),
(100, "emp 1", date "2005-01-01", 100.00D, 10),
(200, "emp 2", date "2003-01-01", 200.00D, 10),
(300, "emp 3", date "2002-01-01", 300.00D, 20),
(400, "emp 4", date "2005-01-01", 400.00D, 30),
(500, "emp 5", date "2001-01-01", 400.00D, NULL),
(600, "emp 6 - no dept", date "2001-01-01", 400.00D, 100),
(700, "emp 7", date "2010-01-01", 400.00D, 100),
(800, "emp 8", date "2016-01-01", 150.00D, 70)
AS EMP(id, emp_name, hiredate, salary, dept_id);

CREATE TEMPORARY VIEW DEPT AS SELECT * FROM VALUES
(10, "dept 1", "CA"),
(20, "dept 2", "NY"),
(30, "dept 3", "TX"),
(40, "dept 4 - unassigned", "OR"),
(50, "dept 5 - unassigned", "NJ"),
(70, "dept 7", "FL")
AS DEPT(dept_id, dept_name, state);

CREATE TEMPORARY VIEW BONUS AS SELECT * FROM VALUES
("emp 1", 10.00D),
("emp 1", 20.00D),
("emp 2", 300.00D),
("emp 2", 100.00D),
("emp 3", 300.00D),
("emp 4", 100.00D),
("emp 5", 1000.00D),
("emp 6 - no dept", 500.00D)
AS BONUS(emp_name, bonus_amt);

-- simple having in subquery.
-- TC.01.01
SELECT dept_id, count(*)
FROM emp
GROUP BY dept_id
HAVING EXISTS (SELECT 1
FROM bonus
WHERE bonus_amt < min(emp.salary));

-- nested having in subquery
-- TC.01.02
SELECT *
FROM dept
WHERE EXISTS (SELECT dept_id,
Count(*)
FROM emp
GROUP BY dept_id
HAVING EXISTS (SELECT 1
FROM bonus
WHERE bonus_amt < Min(emp.salary)));

-- aggregation in outer and inner query block with having
-- TC.01.03
SELECT dept_id,
Max(salary)
FROM emp gp
WHERE EXISTS (SELECT dept_id,
Count(*)
FROM emp p
GROUP BY dept_id
HAVING EXISTS (SELECT 1
FROM bonus
WHERE bonus_amt < Min(p.salary)))
GROUP BY gp.dept_id;

-- more aggregate expressions in projection list of subquery
-- TC.01.04
SELECT *
FROM dept
WHERE EXISTS (SELECT dept_id,
Count(*)
FROM emp
GROUP BY dept_id
HAVING EXISTS (SELECT 1
FROM bonus
WHERE bonus_amt > Min(emp.salary)));

-- multiple aggregations in nested subquery
-- TC.01.05
SELECT *
FROM dept
WHERE EXISTS (SELECT dept_id,
count(emp.dept_id)
FROM emp
WHERE dept.dept_id = dept_id
GROUP BY dept_id
HAVING EXISTS (SELECT 1
FROM bonus
WHERE ( bonus_amt > min(emp.salary)
AND count(emp.dept_id) > 1 )));
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
-- Tests EXISTS subquery support with ORDER BY and LIMIT clauses.

CREATE TEMPORARY VIEW EMP AS SELECT * FROM VALUES
(100, "emp 1", date "2005-01-01", 100.00D, 10),
(100, "emp 1", date "2005-01-01", 100.00D, 10),
(200, "emp 2", date "2003-01-01", 200.00D, 10),
(300, "emp 3", date "2002-01-01", 300.00D, 20),
(400, "emp 4", date "2005-01-01", 400.00D, 30),
(500, "emp 5", date "2001-01-01", 400.00D, NULL),
(600, "emp 6 - no dept", date "2001-01-01", 400.00D, 100),
(700, "emp 7", date "2010-01-01", 400.00D, 100),
(800, "emp 8", date "2016-01-01", 150.00D, 70)
AS EMP(id, emp_name, hiredate, salary, dept_id);

CREATE TEMPORARY VIEW DEPT AS SELECT * FROM VALUES
(10, "dept 1", "CA"),
(20, "dept 2", "NY"),
(30, "dept 3", "TX"),
(40, "dept 4 - unassigned", "OR"),
(50, "dept 5 - unassigned", "NJ"),
(70, "dept 7", "FL")
AS DEPT(dept_id, dept_name, state);

CREATE TEMPORARY VIEW BONUS AS SELECT * FROM VALUES
("emp 1", 10.00D),
("emp 1", 20.00D),
("emp 2", 300.00D),
("emp 2", 100.00D),
("emp 3", 300.00D),
("emp 4", 100.00D),
("emp 5", 1000.00D),
("emp 6 - no dept", 500.00D)
AS BONUS(emp_name, bonus_amt);

-- order by in both outer and/or inner query block
-- TC.01.01
SELECT *
FROM emp
WHERE EXISTS (SELECT dept.dept_id
FROM dept
WHERE emp.dept_id = dept.dept_id
ORDER BY state)
ORDER BY hiredate;

-- TC.01.02
SELECT id,
hiredate
FROM emp
WHERE EXISTS (SELECT dept.dept_id
FROM dept
WHERE emp.dept_id = dept.dept_id
ORDER BY state)
ORDER BY hiredate DESC;

-- order by with not exists
-- TC.01.03
SELECT *
FROM emp
WHERE NOT EXISTS (SELECT dept.dept_id
FROM dept
WHERE emp.dept_id = dept.dept_id
ORDER BY state)
ORDER BY hiredate;

-- group by + order by with not exists
-- TC.01.04
SELECT emp_name
FROM emp
WHERE NOT EXISTS (SELECT max(dept.dept_id) a
FROM dept
WHERE dept.dept_id = emp.dept_id
GROUP BY state
ORDER BY state);
-- TC.01.05
SELECT count(*)
FROM emp
WHERE NOT EXISTS (SELECT max(dept.dept_id) a
FROM dept
WHERE dept.dept_id = emp.dept_id
GROUP BY dept_id
ORDER BY dept_id);

-- limit in the exists subquery block.
-- TC.02.01
SELECT *
FROM emp
WHERE EXISTS (SELECT dept.dept_name
FROM dept
WHERE dept.dept_id > 10
LIMIT 1);

-- limit in the exists subquery block with aggregate.
-- TC.02.02
SELECT *
FROM emp
WHERE EXISTS (SELECT max(dept.dept_id)
FROM dept
GROUP BY state
LIMIT 1);

-- limit in the not exists subquery block.
-- TC.02.03
SELECT *
FROM emp
WHERE NOT EXISTS (SELECT dept.dept_name
FROM dept
WHERE dept.dept_id > 100
LIMIT 1);

-- limit in the not exists subquery block with aggregates.
-- TC.02.04
SELECT *
FROM emp
WHERE NOT EXISTS (SELECT max(dept.dept_id)
FROM dept
WHERE dept.dept_id > 100
GROUP BY state
LIMIT 1);
Loading