Dela via


MATCH (Transact-SQL)

Gäller för: SQL Server 2017 (14.x) och senare versioner Azure SQL DatabaseAzure SQL Managed InstanceSQL Database i Förhandsversion av Microsoft Fabric

Anger ett sökvillkor för ett diagram. MATCH kan endast användas med grafnod- och kanttabeller i SELECT-instruktionen som en del av WHERE-satsen.

Transact-SQL syntaxkonventioner

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

Anger det mönster som ska sökas eller sökvägen för att bläddra i diagrammet. Det här mönstret använder ASCII-konstsyntax för att korsa en sökväg i diagrammet. Mönstret går från en nod till en annan via en kant, i riktning mot den angivna pilen. Kantnamn eller alias anges inom parenteser. Nodnamn eller alias visas i pilens två ändar. Pilen kan gå i båda riktningarna i mönstret.

node_alias

Namn eller alias för en nodtabell som anges i FROM-satsen.

edge_alias

Namn eller alias för en kanttabell som anges i FROM-satsen.

SHORTEST_PATH

Kortast sökvägsfunktion används för att hitta den kortaste sökvägen mellan två angivna noder i en graf eller mellan en viss nod och alla andra noder i en graf. Det tar ett godtyckligt längdmönster som indata, som genomsöks upprepade gånger i ett diagram. Introducerades i SQL Server 2019. Kräver SQL Server 2019 eller senare.

arbitrary_length_match_pattern

Anger de noder och kanter som måste passeras upprepade gånger tills den önskade noden har nåtts eller tills det maximala antalet iterationer som anges i mönstret uppfylls.

al_pattern_quantifier

Det godtyckliga längden mönstret tar reguljära uttryck stil mönster kvantifierare för att ange hur många gånger ett visst sökmönster upprepas. De sökmönsters kvantifierare som stöds är:

  • +: Upprepa mönstret 1 eller fler gånger. Avsluta så snart en kortaste sökväg hittas.
  • {1,n}: Upprepa mönstret 1 för att n gånger. Avsluta så snart en kortaste sökväg hittas.

Remarks

Nodnamnen i MATCH kan upprepas. Med andra ord kan en nod passeras ett godtyckligt antal gånger i samma fråga.
Det går inte att upprepa ett kantnamn i MATCH.
En kant kan peka i båda riktningarna, men den måste ha en explicit riktning.
Operatorerna OR och NOT stöds inte i MATCH-mönstret.
MATCH kan kombineras med andra uttryck med hjälp av AND i WHERE-satsen. Det går dock inte att kombinera den med andra uttryck som använder ELLER eller INTE.

Examples

Hitta en vän

I följande exempel skapas en personnodtabell och en Friends Edge-tabell, vissa data infogas och MATCH används sedan för att hitta vänner till Alice, en person i diagrammet.

 -- 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';

Hitta vän till en vän

I följande exempel försöker du hitta en vän till en vän till 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';

Hitta personer 1-3 hopp bort från en viss person

I följande exempel hittar du den kortaste sökvägen mellan Jacob och alla personer som Jacob är ansluten till i grafen ett till tre hopp bort från honom.

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

Följande är några fler sätt på vilka ett mönster kan anges i 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);