Files
email-tracker/external/duckdb/test/sql/join/semianti/semijoin.test
2025-10-24 19:21:19 -05:00

170 lines
4.2 KiB
SQL

# name: test/sql/join/semianti/semijoin.test
# description: Test semi 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);
# * expression expands all of the left table
query III
SELECT * FROM left_table SEMI JOIN right_table ON left_table.a = right_table.a;
----
42 1 1
# can filter on columns in left table
query III
SELECT * FROM left_table SEMI JOIN right_table ON left_table.a = right_table.a WHERE a > 5;
----
42 1 1
# can have list type expressions in the condition
query III
SELECT * FROM left_table SEMI JOIN right_table ON ([left_table.a, left_table.b] = [right_table.a, right_table.b]);
----
42 1 1
# right table can be a subquery
query III
SELECT * FROM left_table SEMI JOIN (SELECT a as foo from right_table where b = 1) buzz ON left_table.a = buzz.foo
----
42 1 1
# Should throw error when filtering on column in right table
statement error
SELECT * FROM left_table SEMI JOIN right_table ON left_table.a = right_table.a WHERE right_table.a < 43;
----
Binder Error
# left results are not deduplicated
statement ok
INSERT INTO left_table VALUES (42, 1, 5), (42, 1, 5), (42, 1, 5), (42, 1, 5);
query III
SELECT * FROM left_table SEMI JOIN right_table ON (left_table.a = right_table.a);
----
42 1 1
42 1 5
42 1 5
42 1 5
42 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 semi joined on
query III
SELECT * FROM left_table
SEMI 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;
----
42 1 1
42 1 5
42 1 5
42 1 5
42 1 5
statement ok
DELETE FROM left_table where c=5;
# USING COLUMNS also works
query III
SELECT * FROM left_table SEMI JOIN right_table USING (a);
----
42 1 1
# natural semi join also works
query III
SELECT * FROM left_table NATURAL SEMI JOIN right_table;
----
42 1 1
# also with subqueries
query III
SELECT * FROM left_table
NATURAL SEMI JOIN (select right_table.a FROM right_table JOIN other ON (other.a = right_table.a)) joined_right_table;
----
42 1 1
# test correlated queries
# 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 SEMI JOIN right_table ON (left_table.a <> right_table.a) ORDER BY a, c;
----
43 1 1
# range joins
query III
SELECT * FROM left_table SEMI JOIN right_table ON (left_table.a > right_table.a);
----
43 1 1
# complex condition resulting in an any join
query III
SELECT * FROM left_table SEMI 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;
----
43 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 SEMI 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
42 1 5
42 1 5
42 1 5
43 1 1
# complex condition resulting in an any join
query III
SELECT * FROM left_table SEMI JOIN right_table ON ((left_table.a = NULL AND right_table.a = NULL) OR left_table.a = right_table.a) order by left_table.a, left_table.c;
----
42 1 1
42 1 5
42 1 5
42 1 5
# correlated subqueries
query II
SELECT a as outer_a, (SELECT ANY_VALUE(b) FROM right_table where right_table.a != outer_a) right_table_b FROM left_table SEMI JOIN right_table ON (left_table.a = right_table.a) Order by outer_a, right_table_b;
----
42 42
42 42
42 42
42 42
statement ok
SET scalar_subquery_error_on_multiple_rows=false
query II
SELECT a as outer_a, (SELECT b FROM right_table where right_table.a != outer_a) right_table_b FROM left_table SEMI JOIN right_table ON (left_table.a = right_table.a) Order by outer_a, right_table_b;
----
42 42
42 42
42 42
42 42