Class ImplementExceptAsUnion

  • All Implemented Interfaces:
    Rule<ExceptNode>

    public class ImplementExceptAsUnion
    extends Object
    implements Rule<ExceptNode>
    Converts EXCEPT queries into UNION ALL..GROUP BY...WHERE E.g.:
         SELECT a FROM foo
         EXCEPT
         SELECT x FROM bar
     
    =>
         SELECT a
         FROM
         (
             SELECT a,
             COUNT(foo_marker) AS foo_count,
             COUNT(bar_marker) AS bar_count
             FROM
             (
                 SELECT a, true as foo_marker, null as bar_marker
                 FROM foo
                 UNION ALL
                 SELECT x, null as foo_marker, true as bar_marker
                 FROM bar
             ) T1
         GROUP BY a
         ) T2
         WHERE foo_count >= 1 AND bar_count = 0;