Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
              Gäller för: SQL Server 2017 (14.x) och senare versioner 
Azure SQL Database
Azure SQL Managed Instance
SQL 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);