|
| 1 | +-- A test suite for IN HAVING in parent side, subquery, and both predicate subquery |
| 2 | +-- It includes correlated cases. |
| 3 | + |
| 4 | +create temporary view t1 as select * from values |
| 5 | + ("val1a", 6S, 8, 10L, float(15.0), 20D, 20E2, timestamp '2014-04-04 01:00:00.000', date '2014-04-04'), |
| 6 | + ("val1b", 8S, 16, 19L, float(17.0), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', date '2014-05-04'), |
| 7 | + ("val1a", 16S, 12, 21L, float(15.0), 20D, 20E2, timestamp '2014-06-04 01:02:00.001', date '2014-06-04'), |
| 8 | + ("val1a", 16S, 12, 10L, float(15.0), 20D, 20E2, timestamp '2014-07-04 01:01:00.000', date '2014-07-04'), |
| 9 | + ("val1c", 8S, 16, 19L, float(17.0), 25D, 26E2, timestamp '2014-05-04 01:02:00.001', date '2014-05-05'), |
| 10 | + ("val1d", null, 16, 22L, float(17.0), 25D, 26E2, timestamp '2014-06-04 01:01:00.000', null), |
| 11 | + ("val1d", null, 16, 19L, float(17.0), 25D, 26E2, timestamp '2014-07-04 01:02:00.001', null), |
| 12 | + ("val1e", 10S, null, 25L, float(17.0), 25D, 26E2, timestamp '2014-08-04 01:01:00.000', date '2014-08-04'), |
| 13 | + ("val1e", 10S, null, 19L, float(17.0), 25D, 26E2, timestamp '2014-09-04 01:02:00.001', date '2014-09-04'), |
| 14 | + ("val1d", 10S, null, 12L, float(17.0), 25D, 26E2, timestamp '2015-05-04 01:01:00.000', date '2015-05-04'), |
| 15 | + ("val1a", 6S, 8, 10L, float(15.0), 20D, 20E2, timestamp '2014-04-04 01:02:00.001', date '2014-04-04'), |
| 16 | + ("val1e", 10S, null, 19L, float(17.0), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', date '2014-05-04') |
| 17 | + as t1(t1a, t1b, t1c, t1d, t1e, t1f, t1g, t1h, t1i); |
| 18 | + |
| 19 | +create temporary view t2 as select * from values |
| 20 | + ("val2a", 6S, 12, 14L, float(15), 20D, 20E2, timestamp '2014-04-04 01:01:00.000', date '2014-04-04'), |
| 21 | + ("val1b", 10S, 12, 19L, float(17), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', date '2014-05-04'), |
| 22 | + ("val1b", 8S, 16, 119L, float(17), 25D, 26E2, timestamp '2015-05-04 01:01:00.000', date '2015-05-04'), |
| 23 | + ("val1c", 12S, 16, 219L, float(17), 25D, 26E2, timestamp '2016-05-04 01:01:00.000', date '2016-05-04'), |
| 24 | + ("val1b", null, 16, 319L, float(17), 25D, 26E2, timestamp '2017-05-04 01:01:00.000', null), |
| 25 | + ("val2e", 8S, null, 419L, float(17), 25D, 26E2, timestamp '2014-06-04 01:01:00.000', date '2014-06-04'), |
| 26 | + ("val1f", 19S, null, 519L, float(17), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', date '2014-05-04'), |
| 27 | + ("val1b", 10S, 12, 19L, float(17), 25D, 26E2, timestamp '2014-06-04 01:01:00.000', date '2014-06-04'), |
| 28 | + ("val1b", 8S, 16, 19L, float(17), 25D, 26E2, timestamp '2014-07-04 01:01:00.000', date '2014-07-04'), |
| 29 | + ("val1c", 12S, 16, 19L, float(17), 25D, 26E2, timestamp '2014-08-04 01:01:00.000', date '2014-08-05'), |
| 30 | + ("val1e", 8S, null, 19L, float(17), 25D, 26E2, timestamp '2014-09-04 01:01:00.000', date '2014-09-04'), |
| 31 | + ("val1f", 19S, null, 19L, float(17), 25D, 26E2, timestamp '2014-10-04 01:01:00.000', date '2014-10-04'), |
| 32 | + ("val1b", null, 16, 19L, float(17), 25D, 26E2, timestamp '2014-05-04 01:01:00.000', null) |
| 33 | + as t2(t2a, t2b, t2c, t2d, t2e, t2f, t2g, t2h, t2i); |
| 34 | + |
| 35 | +create temporary view t3 as select * from values |
| 36 | + ("val3a", 6S, 12, 110L, float(15), 20D, 20E2, timestamp '2014-04-04 01:02:00.000', date '2014-04-04'), |
| 37 | + ("val3a", 6S, 12, 10L, float(15), 20D, 20E2, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'), |
| 38 | + ("val1b", 10S, 12, 219L, float(17), 25D, 26E2, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'), |
| 39 | + ("val1b", 10S, 12, 19L, float(17), 25D, 26E2, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'), |
| 40 | + ("val1b", 8S, 16, 319L, float(17), 25D, 26E2, timestamp '2014-06-04 01:02:00.000', date '2014-06-04'), |
| 41 | + ("val1b", 8S, 16, 19L, float(17), 25D, 26E2, timestamp '2014-07-04 01:02:00.000', date '2014-07-04'), |
| 42 | + ("val3c", 17S, 16, 519L, float(17), 25D, 26E2, timestamp '2014-08-04 01:02:00.000', date '2014-08-04'), |
| 43 | + ("val3c", 17S, 16, 19L, float(17), 25D, 26E2, timestamp '2014-09-04 01:02:00.000', date '2014-09-05'), |
| 44 | + ("val1b", null, 16, 419L, float(17), 25D, 26E2, timestamp '2014-10-04 01:02:00.000', null), |
| 45 | + ("val1b", null, 16, 19L, float(17), 25D, 26E2, timestamp '2014-11-04 01:02:00.000', null), |
| 46 | + ("val3b", 8S, null, 719L, float(17), 25D, 26E2, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'), |
| 47 | + ("val3b", 8S, null, 19L, float(17), 25D, 26E2, timestamp '2015-05-04 01:02:00.000', date '2015-05-04') |
| 48 | + as t3(t3a, t3b, t3c, t3d, t3e, t3f, t3g, t3h, t3i); |
| 49 | + |
| 50 | +-- correlated IN subquery |
| 51 | +-- HAVING in the subquery |
| 52 | +-- TC 01.01 |
| 53 | +SELECT t1a, |
| 54 | + t1b, |
| 55 | + t1h |
| 56 | +FROM t1 |
| 57 | +WHERE t1b IN (SELECT t2b |
| 58 | + FROM t2 |
| 59 | + GROUP BY t2b |
| 60 | + HAVING t2b < 10); |
| 61 | + |
| 62 | +-- TC 01.02 |
| 63 | +SELECT t1a, |
| 64 | + t1b, |
| 65 | + t1c |
| 66 | +FROM t1 |
| 67 | +WHERE t1b IN (SELECT Min(t2b) |
| 68 | + FROM t2 |
| 69 | + WHERE t1a = t2a |
| 70 | + GROUP BY t2b |
| 71 | + HAVING t2b > 1); |
| 72 | + |
| 73 | +-- HAVING in the parent |
| 74 | +-- TC 01.03 |
| 75 | +SELECT t1a, t1b, t1c |
| 76 | +FROM t1 |
| 77 | +WHERE t1b IN (SELECT t2b |
| 78 | + FROM t2 |
| 79 | + WHERE t1c < t2c) |
| 80 | +GROUP BY t1a, t1b, t1c |
| 81 | +HAVING t1b < 10; |
| 82 | + |
| 83 | +-- TC 01.04 |
| 84 | +SELECT t1a, t1b, t1c |
| 85 | +FROM t1 |
| 86 | +WHERE t1b IN (SELECT t2b |
| 87 | + FROM t2 |
| 88 | + WHERE t1c = t2c) |
| 89 | +GROUP BY t1a, t1b, t1c |
| 90 | +HAVING COUNT (DISTINCT t1b) < 10; |
| 91 | + |
| 92 | +-- BOTH |
| 93 | +-- TC 01.05 |
| 94 | +SELECT Count(DISTINCT( t1a )), |
| 95 | + t1b |
| 96 | +FROM t1 |
| 97 | +WHERE t1c IN (SELECT t2c |
| 98 | + FROM t2 |
| 99 | + WHERE t1a = t2a |
| 100 | + GROUP BY t2c |
| 101 | + HAVING t2c > 10) |
| 102 | +GROUP BY t1b |
| 103 | +HAVING t1b >= 8; |
| 104 | + |
| 105 | +-- TC 01.06 |
| 106 | +SELECT t1a, |
| 107 | + Max(t1b) |
| 108 | +FROM t1 |
| 109 | +WHERE t1b > 0 |
| 110 | +GROUP BY t1a |
| 111 | +HAVING t1a IN (SELECT t2a |
| 112 | + FROM t2 |
| 113 | + WHERE t2b IN (SELECT t3b |
| 114 | + FROM t3 |
| 115 | + WHERE t2c = t3c) |
| 116 | + ); |
| 117 | + |
| 118 | +-- HAVING clause with NOT IN |
| 119 | +-- TC 01.07 |
| 120 | +SELECT t1a, |
| 121 | + t1c, |
| 122 | + Min(t1d) |
| 123 | +FROM t1 |
| 124 | +WHERE t1a NOT IN (SELECT t2a |
| 125 | + FROM t2 |
| 126 | + GROUP BY t2a |
| 127 | + HAVING t2a > 'val2a') |
| 128 | +GROUP BY t1a, t1c |
| 129 | +HAVING Min(t1d) > t1c; |
| 130 | + |
| 131 | +-- TC 01.08 |
| 132 | +SELECT t1a, |
| 133 | + t1b |
| 134 | +FROM t1 |
| 135 | +WHERE t1d NOT IN (SELECT t2d |
| 136 | + FROM t2 |
| 137 | + WHERE t1a = t2a |
| 138 | + GROUP BY t2c, t2d |
| 139 | + HAVING t2c > 8) |
| 140 | +GROUP BY t1a, t1b |
| 141 | +HAVING t1b < 10; |
| 142 | + |
| 143 | +-- TC 01.09 |
| 144 | +SELECT t1a, |
| 145 | + Max(t1b) |
| 146 | +FROM t1 |
| 147 | +WHERE t1b > 0 |
| 148 | +GROUP BY t1a |
| 149 | +HAVING t1a NOT IN (SELECT t2a |
| 150 | + FROM t2 |
| 151 | + WHERE t2b > 3); |
0 commit comments