Skip to content

Commit

Permalink
Merge pull request kayak#457 from foggel/master
Browse files Browse the repository at this point in the history
Support JOINs with _SetOperation subqueries (union, itersect, except, minus)
  • Loading branch information
gl3nn authored Jun 29, 2020
2 parents 75255d2 + 1f6ab34 commit 34f5c24
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 1 deletion.
7 changes: 6 additions & 1 deletion pypika/queries.py
Original file line number Diff line number Diff line change
Expand Up @@ -921,7 +921,9 @@ def orderby(self, *fields: Any, **kwargs: Any) -> "QueryBuilder":
self._orderbys.append((field, kwargs.get("order")))

@builder
def join(self, item: Union[Table, "QueryBuilder", AliasedQuery], how: JoinType = JoinType.inner) -> "Joiner":
def join(
self, item: Union[Table, "QueryBuilder", AliasedQuery, Selectable], how: JoinType = JoinType.inner
) -> "Joiner":
if isinstance(item, Table):
return Joiner(self, item, how, type_label="table")

Expand All @@ -933,6 +935,9 @@ def join(self, item: Union[Table, "QueryBuilder", AliasedQuery], how: JoinType =
elif isinstance(item, AliasedQuery):
return Joiner(self, item, how, type_label="table")

elif isinstance(item, Selectable):
return Joiner(self, item, how, type_label="subquery")

raise ValueError("Cannot join on type '%s'" % type(item))

def inner_join(self, item: Union[Table, "QueryBuilder", AliasedQuery]) -> "Joiner":
Expand Down
24 changes: 24 additions & 0 deletions pypika/tests/test_joins.py
Original file line number Diff line number Diff line change
Expand Up @@ -728,6 +728,30 @@ def test_join_query_with_table_alias(self):
str(test_query),
)

def test_join_query_with_setoperation(self):
subquery = (
Query.from_(self.table_abc).select("*")
.union(
Query.from_(self.table_abc).select("*")
).as_("subq")
)

test_query = (
Query.from_(self.table_abc)
.join(subquery)
.on(subquery.x == self.table_abc.id)
.select(self.table_abc.foo)
)

self.assertEqual(
'SELECT "abc"."foo" FROM "abc" '
'JOIN '
'((SELECT * FROM "abc") '
'UNION '
'(SELECT * FROM "abc")) "subq" '
'ON "subq"."x"="abc"."id"',
str(test_query)
)

class UnionTests(unittest.TestCase):
table1, table2 = Tables("abc", "efg")
Expand Down

0 comments on commit 34f5c24

Please sign in to comment.