Метод union_all класса Select
Метод union_all класса Select объединяет
результаты текущего запроса с результатами другого
запроса или запросов. В отличие от метода union,
метод union_all сохраняет все строки, включая
дубликаты. Первым параметром метод принимает другой
объект Select или несколько запросов. Метод
возвращает новый объект CompoundSelect, который
можно выполнить через сессию или соединение.
Синтаксис
select_stmt.union_all(other_select, *others)
Пример
Давайте создадим две таблицы и объединим их запросы
методом union_all:
from sqlalchemy import create_engine, select, union_all, table, column, Integer, String
engine = create_engine('sqlite:///:memory:')
articles = table(
'articles',
column('id', Integer),
column('title', String),
)
users = table(
'users',
column('id', Integer),
column('title', String),
)
stmt1 = select(articles.c.id, articles.c.title)
stmt2 = select(users.c.id, users.c.title)
res = union_all(stmt1, stmt2)
print(res)
Результат выполнения кода:
"SELECT articles.id, articles.title FROM articles UNION ALL SELECT users.id, users.title FROM users"
Пример
Давайте выполним объединенный запрос и получим строки:
from sqlalchemy import create_engine, select, union_all, table, column, Integer, String
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
conn.execute(table(
'articles',
column('id', Integer),
column('title', String),
).create())
conn.execute(table(
'users',
column('id', Integer),
column('title', String),
).create())
conn.execute(
table(
'articles',
column('id', Integer),
column('title', String),
).insert(),
[{'id': 1, 'title': 'article'}, {'id': 2, 'title': 'article'}],
)
conn.execute(
table(
'users',
column('id', Integer),
column('title', String),
).insert(),
[{'id': 1, 'title': 'user'}, {'id': 2, 'title': 'user'}],
)
articles = table(
'articles',
column('id', Integer),
column('title', String),
)
users = table(
'users',
column('id', Integer),
column('title', String),
)
stmt1 = select(articles.c.title)
stmt2 = select(users.c.title)
res = conn.execute(union_all(stmt1, stmt2)).fetchall()
print(res)
Результат выполнения кода:
[('article',), ('article',), ('user',), ('user',)]
Пример
Давайте сравним union_all и union на
одинаковых данных с дубликатами:
from sqlalchemy import create_engine, select, union, union_all, table, column, Integer, String
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
conn.execute(table(
'articles',
column('id', Integer),
column('title', String),
).create())
conn.execute(
table(
'articles',
column('id', Integer),
column('title', String),
).insert(),
[{'id': 1, 'title': 'article'}, {'id': 2, 'title': 'article'}],
)
articles = table(
'articles',
column('id', Integer),
column('title', String),
)
stmt1 = select(articles.c.title).where(articles.c.id == 1)
stmt2 = select(articles.c.title).where(articles.c.id == 2)
res_all = conn.execute(union_all(stmt1, stmt2)).fetchall()
res_uniq = conn.execute(union(stmt1, stmt2)).fetchall()
print('union_all:', res_all)
print('union:', res_uniq)
Результат выполнения кода:
union_all: [('article',), ('article',)]
union: [('article',)]
Пример
Давайте применим сортировку к объединенному запросу
через метод order_by:
from sqlalchemy import create_engine, select, union_all, table, column, Integer, String
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
conn.execute(table(
'articles',
column('id', Integer),
column('title', String),
).create())
conn.execute(table(
'users',
column('id', Integer),
column('title', String),
).create())
conn.execute(
table(
'articles',
column('id', Integer),
column('title', String),
).insert(),
[{'id': 1, 'title': 'article'}, {'id': 2, 'title': 'article'}],
)
conn.execute(
table(
'users',
column('id', Integer),
column('title', String),
).insert(),
[{'id': 1, 'title': 'user'}, {'id': 2, 'title': 'user'}],
)
articles = table(
'articles',
column('id', Integer),
column('title', String),
)
users = table(
'users',
column('id', Integer),
column('title', String),
)
stmt1 = select(articles.c.title)
stmt2 = select(users.c.title)
res = conn.execute(
union_all(stmt1, stmt2).order_by('title')
).fetchall()
print(res)
Результат выполнения кода:
[('article',), ('article',), ('user',), ('user',)]