UNION#
GQL 절
두 개 이상의 쿼리 결과를 하나로 합칩니다. INTERSECT와 EXCEPT는 다른 두 집합 연산을 쓴 같은
구문입니다.
개요#
굵게 키워드 · 기울임 직접 채우는 자리 · [ ] 생략 가능 · ... 반복 가능. 구문 표기 규약을 참고하십시오.
설명#
집합 연산자는 각각 자기 RETURN을 가진 온전한 두 쿼리를 하나의 결과로 잇습니다:
연산자 |
결과 |
|---|---|
|
두 쿼리 중 어느 쪽에든 있는 행. |
|
두 쿼리 모두에 있는 행. |
|
첫 쿼리에는 있고 둘째 쿼리에는 없는 행. |
셋 모두에 적용되는 규칙입니다:
모든 쿼리가 같은 수의 컬럼을 반환해야 하고, 서로 대응하는 컬럼은 비교할 수 있어야 합니다. 이름은 같지 않아도 됩니다. 결과는 첫 쿼리의 이름을 가져갑니다.
DISTINCT가 기본값입니다. 중복 행은 없어집니다.ALL은 중복을 남깁니다.UNION과UNION DISTINCT는 같은 뜻입니다.연산자는 이어 쓸 수 있고, 이어진 것은 왼쪽에서 오른쪽으로 평가됩니다.
행 순서는 정해져 있지 않습니다. 집합 연산 뒤에 쓴
ORDER BY는 합쳐진 결과를 정렬하지 않습니다. 무엇이 정렬하는지는 참고를 보십시오.각 쿼리는
RETURN으로 끝나는 온전한 쿼리여야 합니다. 한쪽 갈래가 쓰기 절이나MATCH만으로 끝날 수는 없습니다.
매개변수#
- query
RETURN으로 끝나는 온전한 쿼리이며, 이어진 다른 모든 쿼리와 컬럼 수가 같아야 합니다.- ALL
중복 행을 남깁니다.
- DISTINCT
중복 행을 없앱니다. 이것이 기본값입니다.
예제#
모든 예제는 예제 데이터셋에서 실행됩니다.
두 결과 집합 합치기#
Inception에 연결된 모든 사람이며, 연결 방식이 무엇이든 포함합니다:
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)
중복을 남기거나 버리기#
여기서 두 갈래 모두 영화마다 하나씩 같은 18개 장르를 반환합니다. UNION이 그것을 셋으로
줄입니다:
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은 두 갈래의 모든 행을
남깁니다:
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은 비용에만 드러납니다. 중복 제거를 건너뜁니다.
두 쿼리 모두에 있는 행 취하기#
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)
한 쿼리에서 다른 쿼리를 빼기#
무언가를 연출했지만 연기한 적은 없는 사람들입니다:
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)
행은 특정한 순서 없이 돌아옵니다.
합쳐진 결과를 정렬하고 페이지로 나누기#
집합 연산을 NEXT 사슬에 넣고, 합쳐진 행을 받는 사슬의 뒤쪽 절반에서 정렬하십시오:
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 { 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)
컬럼 수가 맞지 않으면 거부된다#
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을 이름으로 부릅니다.
참고#
집합 연산 뒤에 쓴 ORDER BY·SKIP·LIMIT은 합쳐진 결과가 아니라 이어진 것 중 마지막
쿼리에 붙습니다. 그래서 집합이 합쳐지기 전에 그 한 갈래를 정렬하거나 페이지로 나눕니다. 여기서
LIMIT 1은 한 행을 내놓지 않습니다:
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 영화 한 편이 그 행에 합쳐졌습니다. 별칭 해석도 같은 규칙을 따르므로,
정렬 키는 마지막 갈래의 컬럼을 이름으로 불러야 합니다:
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도 같은 일을 합니다:
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)
호환성#
집합 연산자 (ISO/IEC 39075 §14.2)#
표준의 <set operator>는
UNION [ <set quantifier> ] | EXCEPT [ <set quantifier> ] | INTERSECT [ <set quantifier> ]이고,
수량자를 주지 않으면 DISTINCT가 암시됩니다. AgensGraph는 세 연산자와 두 수량자를 모두, 정확히 그
규칙대로 구현합니다. openCypher에는 UNION과 UNION ALL만 있으므로, INTERSECT와 EXCEPT는
여기서는 쓸 수 있고 거기서는 쓸 수 없습니다.
첫 쿼리가 아무것도 반환하지 않을 때만 둘째 쿼리의 행을 취하는 표준의 OTHERWISE 접속은 구현돼
있지 않습니다.
합쳐진 결과 정렬하기 (ISO/IEC 39075 §14.9)#
표준은 <order by and page statement>를 현재 작업 표에 적용하는데, 복합 쿼리 뒤에서 그것은 합쳐진
결과입니다. AgensGraph는 그것을 대신 이어진 것의 마지막 쿼리에 붙이며, 참고에 그것이
나옵니다. 그 연산이 내놓은 것을 정렬하거나 페이지로 나누려면 집합 연산을 NEXT, CALL { }, 또는
SQL의 SELECT로 감싸십시오.
관련 항목#
RETURN— 집합 연산의 모든 갈래가 이것으로 끝난다NEXTGQL — 합쳐진 행에 쿼리를 더 이어 붙이기CALL { subquery }— 집합 연산을 감싸는 또 다른 방법ORDER BY,SKIP·LIMIT— 여기서 그것들이 붙는 대상SQL과 Cypher 섞기 — SQL에서 집합 연산을 정렬하기