|
|
SELECT DISTINCT Alist FROM Rlist WHERE cond (cond contains no subqueries)
SELECT DISTINCT Alist FROM Rlist1 WHERE cond1 and A1 in (SELECT DISTINCT A2 FROM Rlist2 WHERE cond2)
SELECT DISTINCT Alist FROM Rlist1 WHERE cond1 and A1 not in (SELECT DISTINCT A2 FROM Rlist2 WHERE cond2)
SELECT DISTINCT Alist FROM Rlist1 WHERE cond1 and exists (SELECT DISTINCT * FROM Rlist2 WHERE cond2)
SELECT DISTINCT Alist FROM Rlist1 WHERE cond1 and not exists (SELECT DISTINCT * FROM Rlist2 WHERE cond2)
SELECT DISTINCT Alist FROM Rlist1 WHERE cond1 and A1 = ALL (SELECT DISTINCT A2 FROM Rlist2 WHERE cond2)
SELECT DISTINCT Alist FROM Rlist1 WHERE cond1 and NOT A1 = ALL (SELECT DISTINCT A2 FROM Rlist2 WHERE cond2)
SELECT DISTINCT Alist FROM Rlist1 WHERE cond1 and A1 <> ALL (SELECT DISTINCT A2 FROM Rlist2 WHERE cond2)
SELECT DISTINCT Alist FROM Rlist1 WHERE cond1 and not A1 <> ALL (SELECT DISTINCT A2 FROM Rlist2 WHERE cond2)
SELECT DISTINCT Alist FROM Rlist1 WHERE cond1 and A1 < ALL (SELECT DISTINCT A2 FROM Rlist2 WHERE cond2)
SELECT DISTINCT Alist FROM Rlist1 WHERE cond1 and not A1 < ALL (SELECT DISTINCT A2 FROM Rlist2 WHERE cond2)
SELECT DISTINCT Alist FROM Rlist1 WHERE cond1 and A1 <= ALL (SELECT DISTINCT A2 FROM Rlist2 WHERE cond2)
SELECT DISTINCT Alist FROM Rlist1 WHERE cond1 and not A1 <= ALL (SELECT DISTINCT A2 FROM Rlist2 WHERE cond2)
SELECT DISTINCT Alist FROM Rlist1 WHERE cond1 and A1 > ALL (SELECT DISTINCT A2 FROM Rlist2 WHERE cond2)
SELECT DISTINCT Alist FROM Rlist1 WHERE cond1 and not A1 > ALL (SELECT DISTINCT A2 FROM Rlist2 WHERE cond2)
SELECT DISTINCT Alist FROM Rlist1 WHERE cond1 and A1 >= ALL (SELECT DISTINCT A2 FROM Rlist2 WHERE cond2)
SELECT DISTINCT Alist FROM Rlist1 WHERE cond1 and not A1 >= ALL (SELECT DISTINCT A2 FROM Rlist2 WHERE cond2)
SELECT DISTINCT Alist FROM Rlist1 WHERE cond1 and A1 = ANY (SELECT DISTINCT A2 FROM Rlist2 WHERE cond2)
SELECT DISTINCT Alist FROM Rlist1 WHERE cond1 and not A1 = ANY (SELECT DISTINCT A2 FROM Rlist2 WHERE cond2)
SELECT DISTINCT Alist FROM Rlist1 WHERE cond1 and A1 <> ANY (SELECT DISTINCT A2 FROM Rlist2 WHERE cond2)
SELECT DISTINCT Alist FROM Rlist1 WHERE cond1 and not A1 <> ANY (SELECT DISTINCT A2 FROM Rlist2 WHERE cond2)
SELECT DISTINCT Alist FROM Rlist1 WHERE cond1 and A1 < ANY (SELECT DISTINCT A2 FROM Rlist2 WHERE cond2)
SELECT DISTINCT Alist FROM Rlist1 WHERE cond1 and not A1 < ANY (SELECT DISTINCT A2 FROM Rlist2 WHERE cond2)
SELECT DISTINCT Alist FROM Rlist1 WHERE cond1 and A1 <= ANY (SELECT DISTINCT A2 FROM Rlist2 WHERE cond2)
SELECT DISTINCT Alist FROM Rlist1 WHERE cond1 and not A1 <= ANY (SELECT DISTINCT A2 FROM Rlist2 WHERE cond2)
SELECT DISTINCT Alist FROM Rlist1 WHERE cond1 and A1 > ANY (SELECT DISTINCT A2 FROM Rlist2 WHERE cond2)
SELECT DISTINCT Alist FROM Rlist1 WHERE cond1 and not A1 > ANY (SELECT DISTINCT A2 FROM Rlist2 WHERE cond2)
SELECT DISTINCT Alist FROM Rlist1 WHERE cond1 and A1 >= ANY (SELECT DISTINCT A2 FROM Rlist2 WHERE cond2)
SELECT DISTINCT Alist FROM Rlist1 WHERE cond1 and not A1 >= ANY (SELECT DISTINCT A2 FROM Rlist2 WHERE cond2)
Now here's the problem:
(a) For each query type except (1), if you can write an equivalent query using one of the other query types, show the equivalent query. You may assume there are no null values in any of the relations.
(b) Give a minimal set of query types that is sufficient to express
queries equivalent to all 29 query forms. A set of query types is
minimal if taking any type out of the set would produce a strict loss
in expressive power, i.e., not all 29 query forms would be
expressible. Include query type (1) in your minimal set.