다음을 통해 공유


MATCH (Transact-SQL)

적용 대상: SQL Server 2017 (14.x) 및 이후 버전 Azure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric Preview의 SQL 데이터베이스

그래프의 검색 조건을 지정합니다. MATCH는 WHERE 절의 일부로 SELECT 문에서 그래프 노드와 에지 테이블과 함께만 사용할 수 있습니다.

Transact-SQL 구문 표기 규칙

Syntax

MATCH (<graph_search_pattern>)

<graph_search_pattern>::=
  {
      <simple_match_pattern>
    | <arbitrary_length_match_pattern>
    | <arbitrary_length_match_last_node_predicate>
  }

<simple_match_pattern>::=
  {
      LAST_NODE(<node_alias>) | <node_alias>   {
          { <-( <edge_alias> )- }
        | { -( <edge_alias> )-> }
        <node_alias> | LAST_NODE(<node_alias>)
        }
  }
  [ { AND } { ( <simple_match_pattern> ) } ]
  [ , ...n ]

<node_alias> ::=
  node_table_name | node_table_alias

<edge_alias> ::=
  edge_table_name | edge_table_alias

<arbitrary_length_match_pattern>  ::=
  {
    SHORTEST_PATH(
      <arbitrary_length_pattern>
      [ { AND } { <arbitrary_length_pattern> } ]
      [ , ...n ]
    )
  }

<arbitrary_length_match_last_node_predicate> ::=
  {  LAST_NODE( <node_alias> ) = LAST_NODE( <node_alias> ) }

<arbitrary_length_pattern> ::=
    {  LAST_NODE( <node_alias> )   | <node_alias>
     ( <edge_first_al_pattern> [ <edge_first_al_pattern>... , n ] )
     <al_pattern_quantifier>
  }
     |  ( { <node_first_al_pattern> [ <node_first_al_pattern> ... , n ] )
            <al_pattern_quantifier>
        LAST_NODE( <node_alias> ) | <node_alias>
 }

<edge_first_al_pattern> ::=
  { (
        { -( <edge_alias> )->   }
      | { <-( <edge_alias> )- }
      <node_alias>
      )
  }

<node_first_al_pattern> ::=
  { (
      <node_alias>
        { <-( <edge_alias> )- }
      | { -( <edge_alias> )-> }
       )
  }

<al_pattern_quantifier> ::=
  {
        +
      | { 1 , n }
  }

n -  positive integer only.

Arguments

graph_search_pattern

그래프에서 검색 패턴이나 이동하는 경로를 지정합니다. 이 패턴은 그래프의 경로를 이동하기 위해 ASCII art 구문을 사용합니다. 이 패턴은 제공된 화살표 방향으로 에지를 통해 한 노드에서 다른 노드로 이동합니다. 에지 이름 또는 별칭은 괄호 안에 제공됩니다. 노드 이름 또는 별칭은 화살표의 양쪽 끝에 표시됩니다. 화살표는 패턴의 양방향으로 이동할 수 있습니다.

node_alias

FROM 절에 제공된 노드 테이블의 이름 또는 별칭입니다.

edge_alias

FROM 절에 제공된 에지 테이블의 이름 또는 별칭입니다.

SHORTEST_PATH

가장 짧은 경로 함수는 그래프에서 지정된 두 노드 간 또는 지정된 노드와 그래프의 다른 모든 노드 간에 가장 짧은 경로를 찾는 데 사용됩니다. 그래프에서 반복적으로 검색되는 임의 길이 패턴을 입력으로 사용합니다. SQL Server 2019에서 도입되었습니다. SQL Server 2019 이상이 필요합니다.

arbitrary_length_match_pattern

원하는 노드에 도달할 때까지 또는 패턴에 지정된 최대 반복 횟수를 충족할 때까지 반복적으로 트래버스해야 하는 노드와 에지를 지정합니다.

al_pattern_quantifier

임의 길이 패턴은 지정된 검색 패턴의 반복 횟수를 지정하기 위해 정규식 스타일 패턴 한정사를 사용합니다. 지원되는 검색 패턴 한정사는 다음과 같습니다.

  • + : 패턴을 1번 이상 반복합니다. 최단 경로를 찾는 즉시 종료됩니다.
  • {1,n} : 패턴을 1~n번 반복합니다. 최단 경로를 찾는 즉시 종료됩니다.

Remarks

MATCH 내 노드 이름은 반복이 가능합니다. 즉 노드는 같은 쿼리에서 임의의 횟수 만큼 통과할 수 있습니다.
MATCH 내에서는 에지 이름을 반복할 수 없습니다.
에지는 어느 방향이든 가리킬 수 있지만 명시적인 방향이어야 합니다.
OR 및 NOT 연산자는 MATCH 패턴에서 지원되지 않습니다.
MATCH는 WHERE 절에서 AND를 사용하여 다른 식과 결합할 수 있습니다. 그러나 OR 또는 NOT을 사용하여 다른 식과 결합하는 것은 지원되지 않습니다.

Examples

친구 찾기

다음 예에서는 Person 노드 테이블 및 친구 Edge 테이블을 만들고 일부 데이터를 삽입한 다음, MATCH를 사용하여 그래프에 있는 사람인 Alice라는 친구를 찾습니다.

 -- Create person node table
 CREATE TABLE dbo.Person (ID INTEGER PRIMARY KEY, name VARCHAR(50)) AS NODE;
 CREATE TABLE dbo.friend (start_date DATE) AS EDGE;

 -- Insert into node table
 INSERT INTO dbo.Person VALUES (1, 'Alice');
 INSERT INTO dbo.Person VALUES (2,'John');
 INSERT INTO dbo.Person VALUES (3, 'Jacob');

-- Insert into edge table
INSERT INTO dbo.friend VALUES ((SELECT $node_id FROM dbo.Person WHERE name = 'Alice'),
        (SELECT $node_id FROM dbo.Person WHERE name = 'John'), '9/15/2011');

INSERT INTO dbo.friend VALUES ((SELECT $node_id FROM dbo.Person WHERE name = 'Alice'),
        (SELECT $node_id FROM dbo.Person WHERE name = 'Jacob'), '10/15/2011');

INSERT INTO dbo.friend VALUES ((SELECT $node_id FROM dbo.Person WHERE name = 'John'),
        (SELECT $node_id FROM dbo.Person WHERE name = 'Jacob'), '10/15/2012');

-- use MATCH in SELECT to find friends of Alice
SELECT Person2.name AS FriendName
FROM Person Person1, friend, Person Person2
WHERE MATCH(Person1-(friend)->Person2)
AND Person1.name = 'Alice';

친구의 친구 찾기

다음 예제에서는 친구 Alice의 친구를 찾으려 합니다.

SELECT Person3.name AS FriendName
FROM Person Person1, friend, Person Person2, friend friend2, Person Person3
WHERE MATCH(Person1-(friend)->Person2-(friend2)->Person3)
AND Person1.name = 'Alice';

지정된 사람으로부터 1-3 홉 떨어진 사람 찾기

다음 예제에서는 야곱과 야곱이 그래프에서 1~3홉 떨어진 곳에 연결된 모든 사람들 사이의 가장 짧은 경로를 찾습니다.

SELECT
    Person1.name AS PersonName,
    STRING_AGG(Person2.name, '->') WITHIN GROUP (GRAPH PATH) AS Friends
FROM
    Person AS Person1,
    friendOf FOR PATH AS fo,
    Person FOR PATH  AS Person2
WHERE MATCH(SHORTEST_PATH(Person1(-(fo)->Person2){1,3}))
AND Person1.name = 'Jacob'

More patterns

다음은 MATCH 안에서 패턴을 지정하는 몇 가지 다른 방법입니다.

 -- Find a friend
    SELECT Person2.name AS FriendName
    FROM Person Person1, friend, Person Person2
    WHERE MATCH(Person1-(friend)->Person2);

-- The pattern can also be expressed as below

    SELECT Person2.name AS FriendName
    FROM Person Person1, friend, Person Person2
    WHERE MATCH(Person2<-(friend)-Person1);

-- Find 2 people who are both friends with same person
    SELECT Person1.name AS Friend1, Person2.name AS Friend2
    FROM Person Person1, friend friend1, Person Person2,
         friend friend2, Person Person0
    WHERE MATCH(Person1-(friend1)->Person0<-(friend2)-Person2);

-- this pattern can also be expressed as below

    SELECT Person1.name AS Friend1, Person2.name AS Friend2
    FROM Person Person1, friend friend1, Person Person2,
         friend friend2, Person Person0
    WHERE MATCH(Person1-(friend1)->Person0 AND Person2-(friend2)->Person0);