{#union-union} # UNION {bdg-primary-line}`GQL 절` 두 개 이상의 쿼리 결과를 하나로 합칩니다. `INTERSECT`와 `EXCEPT`는 다른 두 집합 연산을 쓴 같은 구문입니다. {#union-synopsis} ## 개요
query { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] query [ ... ]

굵게 키워드 · 기울임 직접 채우는 자리 · [ ] 생략 가능 · ... 반복 가능. 구문 표기 규약을 참고하십시오.

{#union-description} ## 설명 집합 연산자는 각각 자기 `RETURN`을 가진 온전한 두 쿼리를 하나의 결과로 잇습니다: | 연산자 | 결과 | | --- | --- | | `UNION` | 두 쿼리 중 어느 쪽에든 있는 행. | | `INTERSECT` | 두 쿼리 모두에 있는 행. | | `EXCEPT` | 첫 쿼리에는 있고 둘째 쿼리에는 없는 행. | 셋 모두에 적용되는 규칙입니다: - 모든 쿼리가 **같은 수의 컬럼**을 반환해야 하고, 서로 대응하는 컬럼은 비교할 수 있어야 합니다. 이름은 같지 않아도 됩니다. 결과는 첫 쿼리의 이름을 가져갑니다. - `DISTINCT`가 기본값입니다. 중복 행은 없어집니다. `ALL`은 중복을 남깁니다. `UNION`과 `UNION DISTINCT`는 같은 뜻입니다. - 연산자는 **이어 쓸 수 있고**, 이어진 것은 왼쪽에서 오른쪽으로 평가됩니다. - 행 순서는 정해져 있지 않습니다. 집합 연산 뒤에 쓴 `ORDER BY`는 합쳐진 결과를 정렬하지 **않습니다.** 무엇이 정렬하는지는 [참고](#union-notes)를 보십시오. - 각 쿼리는 `RETURN`으로 끝나는 온전한 쿼리여야 합니다. 한쪽 갈래가 쓰기 절이나 `MATCH`만으로 끝날 수는 없습니다. {#union-parameters} ## 매개변수 query : `RETURN`으로 끝나는 온전한 쿼리이며, 이어진 다른 모든 쿼리와 컬럼 수가 같아야 합니다. ALL : 중복 행을 남깁니다. DISTINCT : 중복 행을 없앱니다. 이것이 기본값입니다. {#union-examples} ## 예제 모든 예제는 [예제 데이터셋](../../get_started/example-dataset.md)에서 실행됩니다. {#union-combine-two-result-sets} ### 두 결과 집합 합치기 `Inception`에 연결된 모든 사람이며, 연결 방식이 무엇이든 포함합니다: ```cypher MATCH (p:person)-[:directed]->(:movie {title: 'Inception'}) RETURN p.name AS name UNION MATCH (p:person)-[:acted_in]->(:movie {title: 'Inception'}) RETURN p.name AS name; ``` ``` name --------------------- "Christopher Nolan" "Leonardo DiCaprio" (2 rows) ``` {#union-keep-or-drop-the-duplicates} ### 중복을 남기거나 버리기 여기서 두 갈래 모두 영화마다 하나씩 같은 18개 장르를 반환합니다. `UNION`이 그것을 셋으로 줄입니다: ```cypher MATCH (m:movie) RETURN m.genre AS genre UNION MATCH (m:movie) RETURN m.genre AS genre; ``` ``` genre ------------- "Action" "Sci-Fi" "Adventure" (3 rows) ``` `UNION DISTINCT`는 같은 문장을 온전히 적은 것입니다. `UNION ALL`은 두 갈래의 모든 행을 남깁니다: ```cypher MATCH (m:movie {genre: 'Adventure'}) RETURN m.title AS film UNION ALL MATCH (m:movie) WHERE m.year = 2021 RETURN m.title AS film; ``` ``` film ---------------------------- "Jurassic Park" "The Matrix Resurrections" (2 rows) ``` 그 두 행은 어차피 서로 다르므로 `ALL`은 비용에만 드러납니다. 중복 제거를 건너뜁니다. {#union-take-the-rows-in-both-queries} ### 두 쿼리 모두에 있는 행 취하기 ```cypher MATCH (m:movie {genre: 'Action'}) RETURN m.title AS film INTERSECT MATCH (m:movie) WHERE m.year < 1995 RETURN m.title AS film; ``` ``` film ------------------------------ "The Terminator" "Terminator 2: Judgment Day" (2 rows) ``` {#union-subtract-one-query-from-another} ### 한 쿼리에서 다른 쿼리를 빼기 무언가를 연출했지만 연기한 적은 없는 사람들입니다: ```cypher MATCH (p:person)-[:directed]->(m:movie) RETURN p.name AS name EXCEPT MATCH (p:person)-[:acted_in]->(m:movie) RETURN p.name AS name; ``` ``` name --------------------- "Andrew Niccol" "Neill Blomkamp" "Lana Wachowski" "Lilly Wachowski" "Joss Whedon" "James Cameron" "Luc Besson" "Denis Villeneuve" "Christopher Nolan" "Paul Verhoeven" "Ridley Scott" "Steven Spielberg" (12 rows) ``` 행은 특정한 순서 없이 돌아옵니다. {#union-sort-and-page-the-combined-result} ### 합쳐진 결과를 정렬하고 페이지로 나누기 집합 연산을 [`NEXT`](next.md) 사슬에 넣고, 합쳐진 행을 받는 사슬의 뒤쪽 절반에서 정렬하십시오: ```cypher MATCH (m:movie) WHERE m.genre = 'Adventure' RETURN m.title AS film UNION MATCH (m:movie) WHERE m.genre = 'Sci-Fi' RETURN m.title AS film NEXT ORDER BY film LIMIT 3 RETURN film; ``` ``` film --------------------- "Avatar" "Blade Runner" "Blade Runner 2049" (3 rows) ``` [`CALL { subquery }`](call-subquery.md)로 감싸도 같은 일을 합니다: ```cypher CALL { MATCH (m:movie) WHERE m.genre = 'Adventure' RETURN m.title AS film UNION MATCH (m:movie) WHERE m.genre = 'Sci-Fi' RETURN m.title AS film } RETURN film ORDER BY film LIMIT 3; ``` ``` film --------------------- "Avatar" "Blade Runner" "Blade Runner 2049" (3 rows) ``` {#union-reject-a-mismatched-column-count} ### 컬럼 수가 맞지 않으면 거부된다 ```cypher MATCH (m:movie) RETURN m.title AS t UNION MATCH (p:person) RETURN p.name AS n, p.born AS b; ``` ``` ERROR: each UNION query must have the same number of columns ``` 이 메시지는 세 연산자 모두에 대해 `UNION`을 이름으로 부릅니다. {#union-notes} ## 참고 집합 연산 뒤에 쓴 `ORDER BY`·`SKIP`·`LIMIT`은 합쳐진 결과가 아니라 **이어진 것 중 마지막 쿼리**에 붙습니다. 그래서 집합이 합쳐지기 전에 그 한 갈래를 정렬하거나 페이지로 나눕니다. 여기서 `LIMIT 1`은 한 행을 내놓지 않습니다: ```cypher MATCH (m:movie) WHERE m.genre = 'Adventure' RETURN m.title AS film UNION MATCH (m:movie) WHERE m.genre = 'Sci-Fi' RETURN m.title AS film LIMIT 1; ``` ``` film ----------------- "Inception" "Jurassic Park" (2 rows) ``` 공상 과학 갈래에서 `LIMIT`을 넘어 한 행이 살아남았고, 그 갈래는 `LIMIT`이 없으면 영화 10편을 반환합니다. 그 뒤에 Adventure 영화 한 편이 그 행에 합쳐졌습니다. 별칭 해석도 같은 규칙을 따르므로, 정렬 키는 마지막 갈래의 컬럼을 이름으로 불러야 합니다: ```cypher MATCH (m:movie) RETURN m.title AS first_col UNION MATCH (p:person) RETURN p.name AS second_col ORDER BY first_col LIMIT 2; ``` ``` ERROR: variable does not exist LINE 4: ORDER BY first_col LIMIT 2; ^ ``` 합쳐진 행을 정렬하거나 페이지로 나눠야 할 때는 언제든 위에 보인 `NEXT`나 `CALL` 형태를 쓰십시오. SQL에서는 그 집합 연산 위의 `SELECT`도 같은 일을 합니다: ```psql SELECT * FROM ( MATCH (m:movie) WHERE m.genre = 'Adventure' RETURN m.title AS film UNION MATCH (m:movie) WHERE m.genre = 'Sci-Fi' RETURN m.title AS film ) q ORDER BY film LIMIT 3; ``` ``` film --------------------- "Avatar" "Blade Runner" "Blade Runner 2049" (3 rows) ``` {#union-compatibility} ## 호환성 {#union-set-operators-isoiec-39075-142} ### 집합 연산자 (ISO/IEC 39075 §14.2) 표준의 ``는 `UNION [ ] | EXCEPT [ ] | INTERSECT [ ]`이고, 수량자를 주지 않으면 `DISTINCT`가 암시됩니다. AgensGraph는 세 연산자와 두 수량자를 모두, 정확히 그 규칙대로 구현합니다. openCypher에는 `UNION`과 `UNION ALL`만 있으므로, `INTERSECT`와 `EXCEPT`는 여기서는 쓸 수 있고 거기서는 쓸 수 없습니다. 첫 쿼리가 아무것도 반환하지 않을 때만 둘째 쿼리의 행을 취하는 표준의 `OTHERWISE` 접속은 구현돼 있지 않습니다. {#union-sorting-a-combined-result-isoiec-39075-149} ### 합쳐진 결과 정렬하기 (ISO/IEC 39075 §14.9) 표준은 ``를 현재 작업 표에 적용하는데, 복합 쿼리 뒤에서 그것은 합쳐진 결과입니다. AgensGraph는 그것을 대신 이어진 것의 마지막 쿼리에 붙이며, [참고](#union-notes)에 그것이 나옵니다. 그 연산이 내놓은 것을 정렬하거나 페이지로 나누려면 집합 연산을 `NEXT`, `CALL { }`, 또는 SQL의 `SELECT`로 감싸십시오. {#union-see-also} ## 관련 항목 - [`RETURN`](return.md) — 집합 연산의 모든 갈래가 이것으로 끝난다 - [`NEXT`](next.md) {bdg-primary-line}`GQL` — 합쳐진 행에 쿼리를 더 이어 붙이기 - [`CALL { subquery }`](call-subquery.md) — 집합 연산을 감싸는 또 다른 방법 - [`ORDER BY`](order-by.md), [`SKIP`·`LIMIT`](skip-and-limit.md) — 여기서 그것들이 붙는 대상 - [SQL과 Cypher 섞기](../../querying/combining-sql-and-cypher.md) — SQL에서 집합 연산을 정렬하기