Функция intersect_all
Функция intersect_all возвращает все строки,
которые присутствуют в обоих запросах, сохраняя
дубликаты. В отличие от intersect, она не удаляет
повторяющиеся строки из результата. Первым параметром
функция принимает второй запрос, с которым выполняется
пересечение. Обычно применяется к объектам Select.
Синтаксис
select(...).intersect_all(select(...))
Пример
Давайте создадим два простых запроса и объединим
их через intersect_all:
from sqlalchemy import select, literal
q1 = select(literal(1).label('num'))
q2 = select(literal(1).label('num'))
res = q1.intersect_all(q2)
print(res)
Результат выполнения кода:
"SELECT 1 AS num INTERSECT ALL SELECT 1 AS num"
Пример
Давайте выполним запрос с intersect_all на
таблице articles и выведем полученные строки:
from sqlalchemy import create_engine, select, MetaData, Table, Column, Integer, String
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('status', String),
)
metadata.create_all(engine)
with engine.begin() as conn:
conn.execute(articles.insert(), [
{'id': 1, 'title': 'article 1', 'status': 'published'},
{'id': 2, 'title': 'article 2', 'status': 'draft'},
{'id': 3, 'title': 'article 3', 'status': 'published'},
])
q1 = select(articles.c.status)
q2 = select(articles.c.status)
res = q1.intersect_all(q2)
with engine.connect() as conn:
for row in conn.execute(res):
print(row)
Результат выполнения кода:
('published',)
('draft',)
('published',)
Пример
Давайте сравним поведение intersect и
intersect_all на одинаковых данных:
from sqlalchemy import create_engine, select, MetaData, Table, Column, Integer, String
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('status', String),
)
metadata.create_all(engine)
with engine.begin() as conn:
conn.execute(articles.insert(), [
{'id': 1, 'title': 'article 1', 'status': 'published'},
{'id': 2, 'title': 'article 2', 'status': 'published'},
])
q1 = select(articles.c.status)
q2 = select(articles.c.status)
res_plain = q1.intersect(q2)
res_all = q1.intersect_all(q2)
with engine.connect() as conn:
print('intersect:', list(conn.execute(res_plain)))
print('intersect_all:', list(conn.execute(res_all)))
Результат выполнения кода:
"intersect: [('published',)]"
"intersect_all: [('published',), ('published',)]"