합친 행이 사라질 때, SQL UNION과 UNION ALL

이 카테고리 글 목록

전체글 보기

두 조회 결과를 아래로 이어 붙이고 같은 값도 건수대로 남기려면 UNION ALL을 쓰세요. UNION은 합친 결과에서 중복 행을 한 번만 남깁니다. 이때 중복인지는 선택한 열 전체를 기준으로 판단합니다.

같은 상품 이름이 두 묶음에 들어 있을 때

가상의 오전 목록에는 clip과 pen, 오후 목록에는 pen과 tape가 있습니다. 먼저 상품 이름만 합치고, 마지막 쿼리에서는 어느 묶음에서 왔는지도 선택합니다.

import sqlite3

db = sqlite3.connect(":memory:")
inputs = """
    WITH morning(item) AS (VALUES ('clip'), ('pen')),
         evening(item) AS (VALUES ('pen'), ('tape'))
"""
for operator in ("UNION ALL", "UNION"):
    rows = db.execute(inputs + f"""
        SELECT item FROM morning
        {operator}
        SELECT item FROM evening
        ORDER BY item
    """)
    print(operator, [item for (item,) in rows])

rows = db.execute(inputs + """
    SELECT item, 'morning' AS batch FROM morning
    UNION
    SELECT item, 'evening' AS batch FROM evening
    ORDER BY item, batch
""")
print("UNION with batch", rows.fetchall())
db.close()
UNION ALL ['clip', 'pen', 'pen', 'tape']
UNION ['clip', 'pen', 'tape']
UNION with batch [('clip', 'morning'), ('pen', 'evening'), ('pen', 'morning'), ('tape', 'evening')]

상품 이름만 선택하면 오전의 pen과 오후의 pen은 같은 행으로 비교됩니다. 출처 열 batch를 함께 선택하면 ('pen', 'evening')과 ('pen', 'morning')이 서로 달라서 UNION에서도 둘 다 남습니다.

두 묶음의 기록을 건수대로 유지할지, 상품 이름의 종류만 모을지에 따라 연산자와 열을 같이 고르세요. 두 SELECT의 결과 열 개수는 같아야 합니다. 출력 순서가 중요하다면 예제처럼 전체 쿼리 끝에 ORDER BY를 붙입니다. 각 행에 다른 표의 열을 붙여야 하는 경우에는 JOIN 키가 결과 행 수에 미치는 영향에서 별도의 예를 볼 수 있습니다.

가상 목록은 Windows의 Python 3.14.3 내장 sqlite3에서 SQLite 3.50.4로 실행했습니다. 자세한 비교와 정렬 규칙은 SQLite의 복합 SELECT에 나와 있습니다.

이 카테고리의 다른 글

전체글 보기

댓글 남기기