MATCH (Transact-SQL)
Berlaku untuk: SQL Server 2017 (14.x) dan azure SQL Database Azure 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.
Sintaks
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.
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