Aracılığıyla paylaş


MAÇ (Transact-SQL)

Şunlar için geçerlidir: SQL Server 2017 (14.x) ve sonraki sürümleri Microsoft Fabric'teAzure SQL VeritabanıAzure SQL Yönetilen Örneği SQL veritabanı

Grafik için bir arama koşulu belirtir. KAÇINCI, WHERE yan tümcesinin bir parçası olarak SELECT deyiminde yalnızca grafik düğümü ve kenar tablolarıyla kullanılabilir.

Transact-SQL söz dizimi kuralları

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

Grafikte çapraz geçiş yapmak için aranacak düzeni veya yolu belirtir. Bu desen, grafikteki bir yolu çapraz geçiş yapmak için ASCII resim söz dizimini kullanır. Desen, sağlanan ok yönünde bir kenar üzerinden bir düğümden diğerine gider. Kenar adları veya diğer adları parantez içinde sağlanır. Düğüm adları veya diğer adları okun iki ucunda görünür. Ok, desende iki yönde de gidebilir.

node_alias

FROM yan tümcesinde sağlanan düğüm tablosunun adı veya diğer adı.

edge_alias

FROM yan tümcesinde sağlanan bir kenar tablosunun adı veya diğer adı.

SHORTEST_PATH

En kısa yol işlevi, bir grafikteki belirli iki düğüm arasındaki veya belirli bir düğüm ile bir grafikteki diğer tüm düğümler arasındaki en kısa yolu bulmak için kullanılır. Giriş olarak rastgele bir uzunluk deseni alır ve grafikte tekrar tekrar aranır. SQL Server 2019'da kullanıma sunulmuştur. SQL Server 2019 veya üzerini gerektirir.

arbitrary_length_match_pattern

İstenen düğüme ulaşılana kadar veya desende belirtilen en fazla yineleme sayısına ulaşılana kadar art arda geçmesi gereken düğümleri ve kenarları belirtir.

al_pattern_quantifier

Rastgele uzunluk deseni, belirli bir arama deseninin kaç kez yineleneceğini belirtmek için normal ifade stili deseni niceleyicilerini alır. Desteklenen arama deseni niceleyicileri şunlardır:

  • +: Deseni 1 veya daha fazla kez yineleyin. En kısa yol bulunur bulunmaz sonlandırılır.
  • {1,n}: Deseni 1 ile n kez yineleyin. En kısa yol bulunur bulunmaz sonlandırılır.

Remarks

KAÇINCI içindeki düğüm adları yinelenebilir. Başka bir deyişle, bir düğüm aynı sorguda rastgele birkaç kez geçirilebilir.
Kenar adı, KAÇINCI içinde tekrarlanamaz.
Kenar her iki yönü de işaret edebilir, ancak açık bir yönü olmalıdır.
VEYA ve DEĞİl işleçleri MATCH düzeninde desteklenmez.
KAÇINCI, WHERE yan tümcesinde VE kullanılarak diğer ifadelerle birleştirilebilir. Ancak, VEYA veya DEĞİl kullanarak bunu diğer ifadelerle birleştirmek desteklenmez.

Examples

Bir arkadaş bulun

Aşağıdaki örnek bir Kişi düğüm tablosu ve arkadaş Edge tablosu oluşturur, bazı veriler ekler ve ardından graftaki bir kişi olan Alice'in arkadaşlarını bulmak için KAÇINCI'yı kullanır.

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

Bir arkadaşınızın arkadaşını bulma

Aşağıdaki örnek, Alice'in bir arkadaşının arkadaşını bulmaya çalışır.

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

Belirli bir kişiden 1-3 atlama uzakta kişileri bulma

Aşağıdaki örnek, Jacob ile Jacob'ın bağlı olduğu tüm kişiler arasındaki en kısa yolu grafikte bir ila üç atlama ötede bulur.

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'

Diğer desenler

Aşağıda, MATCH içinde bir desenin belirtilebileceği bazı diğer yollar yer alır.

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