# name: test/sql/join/semianti/antijoin.test # description: Test positional joins # group: [semianti] statement ok PRAGMA enable_verification statement ok CREATE TABLE left_table (a INTEGER, b INTEGER, c INTEGER); statement ok INSERT INTO left_table VALUES(42, 1, 1), (43, 1, 1); statement ok CREATE TABLE right_table (a INTEGER, b INTEGER); statement ok INSERT INTO right_table VALUES(42, 1); # STAR expression expands only the left table query III SELECT * FROM left_table ANTI JOIN right_table ON left_table.a = right_table.a; ---- 43 1 1 # can filter on columns in left table query III SELECT * FROM left_table ANTI JOIN right_table ON left_table.a = right_table.a WHERE a > 5; ---- 43 1 1 # can have list type expressions in the condition query III SELECT * FROM left_table ANTI JOIN right_table ON ([left_table.a, left_table.b] = [right_table.a, right_table.b]); ---- 43 1 1 # right table can be a subquery query III SELECT * FROM left_table ANTI JOIN (SELECT a as foo from right_table where b = 1) buzz ON left_table.a = buzz.foo ---- 43 1 1 # Should throw error when filtering on column in right table statement error SELECT * FROM left_table ANTI JOIN right_table ON left_table.a = right_table.a WHERE right_table.a < 43; ---- Binder Error statement ok INSERT INTO left_table VALUES (43, 1, 5), (43, 1, 5), (43, 1, 5), (43, 1, 5); # left results are not deduplicated query III SELECT * FROM left_table ANTI JOIN right_table ON (left_table.a = right_table.a); ---- 43 1 1 43 1 5 43 1 5 43 1 5 43 1 5 query I CREATE TABLE other (a INTEGER, b INTEGER); statement ok INSERT INTO other VALUES (42, 1), (43, 1); # a table that is the result of a join can also be anti joined on query III SELECT * FROM left_table ANTI JOIN (select right_table.a FROM right_table JOIN other ON (other.a = right_table.a)) joined_right_table ON left_table.a = joined_right_table.a; ---- 43 1 1 43 1 5 43 1 5 43 1 5 43 1 5 statement ok DELETE FROM left_table where c=5; # USING COLUMNS also works query III SELECT * FROM left_table ANTI JOIN right_table USING (a); ---- 43 1 1 # natural anti join works query III SELECT * FROM left_table NATURAL ANTI JOIN right_table; ---- 43 1 1 query III SELECT * FROM left_table NATURAL ANTI JOIN (select right_table.a FROM right_table JOIN other ON (other.a = right_table.a)) joined_right_table; ---- 43 1 1 # right_table.a and left_table.a have the value 42 # only left_table.a has the value 43 # test inequality joins query III SELECT * FROM left_table ANTI JOIN right_table ON (left_table.a <> right_table.a) ORDER BY a, c; ---- 42 1 1 # range joins query III SELECT * FROM left_table ANTI JOIN right_table ON (left_table.a > right_table.a); ---- 42 1 1 statement ok SELECT * from left_table, right_table; # complex condition resulting in an any join query III SELECT * FROM left_table ANTI JOIN right_table ON (left_table.a + right_table.a = 85 OR left_table.a + right_table.b = 84) order by left_table.a, left_table.c; ---- 42 1 1 statement ok INSERT INTO right_table VALUES (1, 42), (1, 42); # Insert more values so that the scan side in the cross product is the right hand side statement ok INSERT INTO left_table VALUES (42, 1, 5), (42, 1, 5), (42, 1, 5), (2000, 20000, 200000); # complex condition resulting in an any join query III SELECT * FROM left_table ANTI JOIN right_table ON (left_table.a + right_table.a = 85 OR left_table.a + right_table.b = 84) order by left_table.a, left_table.c; ---- 2000 20000 200000 # correlated subqueries query II SELECT a as outer_a, (SELECT MAX(right_table.b) FROM right_table where right_table.a != outer_a) right_table_b FROM left_table ANTI JOIN right_table ON (left_table.a = right_table.a) Order by outer_a, right_table_b; ---- 43 42 2000 42 statement ok INSERT INTO right_table VALUES (1, 20); # correlated subqueries query II SELECT a as outer_a, (SELECT MAX(b) FROM right_table where right_table.a != outer_a) right_table_b FROM left_table ANTI JOIN right_table ON (left_table.a = right_table.a) Order by outer_a, right_table_b; ---- 43 42 2000 42 statement ok SET scalar_subquery_error_on_multiple_rows=false # this is probably not deterministic query II SELECT a as outer_a, (SELECT b FROM right_table where right_table.a != outer_a) right_table_b FROM left_table ANTI JOIN right_table ON (left_table.a = right_table.a) Order by outer_a, right_table_b; ---- 43 20 2000 20