MATCH (Transact-SQL)

Berlaku untuk: SQL Server 2017 (14.x) dan azure SQL DatabaseAzure SQL Managed Instance yang lebih baru

Menentukan kondisi pencarian untuk grafik. MATCH hanya dapat digunakan dengan simpul grafik dan tabel tepi, dalam pernyataan SELECT sebagai bagian dari klausa WHERE.

Konvensi sintaks transact-SQL

Sintaksis

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.
 

Catatan

Untuk melihat sintaks Transact-SQL untuk SQL Server 2014 (12.x) dan versi yang lebih lama, lihat Dokumentasi versi sebelumnya.

Argumen

graph_search_pattern
Menentukan pola untuk mencari atau jalur untuk melintasi grafik. Pola ini menggunakan sintaks seni ASCII untuk melintasi jalur dalam grafik. Pola beralih dari satu simpul ke simpul lainnya melalui tepi, ke arah panah yang disediakan. Nama atau alias edge disediakan di dalam tanda kurung. Nama atau alias simpul muncul di dua ujung panah. Panah dapat masuk ke salah satu arah dalam pola.

node_alias
Nama atau alias tabel simpul yang disediakan dalam klausa FROM.

edge_alias
Nama atau alias tabel edge yang disediakan dalam klausa FROM.

SHORTEST_PATH Fungsi jalur terpendek digunakan untuk menemukan jalur terpendek antara dua simpul yang diberikan dalam grafik atau antara simpul tertentu dan semua simpul lain dalam grafik. Dibutuhkan pola panjang arbitrer sebagai input, yang dicari berulang kali dalam grafik. Diperkenalkan di SQL Server 2019. Memerlukan SQL Server 2019 atau yang lebih baru.

arbitrary_length_match_pattern
Menentukan simpul dan tepi yang harus dilalui berulang kali hingga simpul yang diinginkan tercapai atau hingga jumlah maksimum perulangan seperti yang ditentukan dalam pola terpenuhi.

al_pattern_quantifier
Pola panjang arbitrer mengambil pengukur pola gaya ekspresi reguler untuk menentukan berapa kali pola pencarian tertentu diulang. Kuantifier pola pencarian yang didukung adalah:

  • +: Ulangi pola 1 atau lebih kali. Hentikan segera setelah jalur terpendek ditemukan.
  • {1,n}: Ulangi pola 1 hingga n kali. Hentikan segera setelah jalur terpendek ditemukan.

Keterangan

Nama node di dalam MATCH dapat diulang. Dengan kata lain, simpul dapat dilalui berapa kali dalam kueri yang sama.
Nama tepi tidak dapat diulang di dalam MATCH.
Tepi dapat menunjuk ke salah satu arah, tetapi harus memiliki arah eksplisit.
Operator OR dan NOT tidak didukung dalam pola MATCH. MATCH dapat dikombinasikan dengan ekspresi lain menggunakan AND dalam klausa WHERE. Namun, menggabungkannya dengan ekspresi lain menggunakan OR ATAU NOT tidak didukung.

Contoh

J. Cari teman

Contoh berikut membuat tabel simpul Orang dan tabel teman Edge, menyisipkan beberapa data lalu menggunakan MATCH untuk menemukan teman Alice, seseorang dalam grafik.

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

B. Temukan teman teman

Contoh berikut mencoba menemukan teman teman 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';

C. Pola lainnya MATCH

Berikut adalah beberapa cara lain di mana pola dapat ditentukan di dalam 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);

Lihat Juga

CREATE TABLE (SQL Graph)
INSERT (SQL Graph)]
Pemrosesan grafik dengan SQL Server 2017