ืืคื ื ืชืืืืช ืืงืืจืก
ืืกืื ื ืชืื ืื ืฉื ืืจืคืื ืื ืืื ืืืืืื ืืฉืืื ืืื ืฉื ืืงืฆืืข ืืชืืื ืืกืื ืื ืชืื ืื. ืื ื ืื ืกื ืืืชืขืืื ืืืืืืฉืื ืืืืื ืืืืืืืช ืืืฉืืช ืืชืืื ืื, ืืืืืจ ืขืืืื ืขื ืืกืื ื ืชืื ืื ืจืืฆืืื ืืื ื-NoSQL, ืื ื ืจืืื ืืช ืืชืคืงืื ืฉื ืืกืื ื ืชืื ืื ืืจืคืื ืืืคื ืืฉืื ืืืชืจ ืืืืชืจ. ืืืฉืจ ืขืืืืื ืขื ื ืชืื ืื ืืืจืจืืืื ืืืจืืืื, ืื ืจืง ืืกืื ื ืชืื ืื ืืกืืจืชืืื ืืื ื ืืขืืืื, ืืื ืื NoSQL. ืืขืชืื ืงืจืืืืช, ืืื ืฉืืกืคืจ ืจืืืช ืืืืืืจ ืืืืื ืืกื ืื ืชืื ืื ืืืืื, ืืืืฆืืขืื ืืืจืืื. ืืืื ืฉืืขืจืืืช ืืืืกืื ืืืคืืืช ืืืจืืืืช ืืืชืจ, ืืกืคืจ ื-JOIN ืืื ืื ืืื.
ืืืืื ืฉืืืืื ืืืชืืืืกืืชื ืืฉ ืคืชืจืื ืืช ืืขืืืื ืขื ืืืจืจืืืืช (ืืืืืื, ืฉืืืืฉ ื-CTEs ืจืงืืจืกืืื), ืืื ืืื ืขืืืื ืืจืืื ืืขืงืืคืช ืืืขืื. ืืื ืขื ืืืช, ืืคืื ืงืฆืืื ืืืืช ืฉื ืืกืื ื ืชืื ืื ืืจืคืื ืฉื SQL Server ืืืคืฉืจืช ืื ืืืคื ืืงืืืช ืืืกืคืจ ืจืืืช ืฉื ืืืจืจืืื. ืื ืืืื ืื ืชืื ืื ืืื ืืฉืืืืชืืช ืืคืืฉืืื, ืืืื ืืืขืืืืช ืฉืืื ืขืืื. ืืืืช ืืงืื ืืฆืืืฆืืช ืืฉืืขืืชืืช.
ืืกืื ื ืชืื ืื ืฉื ืืจืคืื ืื ืฉืคื ืืงืกืคืจืกืืืืช ืืืืฆืื ืืขืจืืืช ืืืจืืืืช. ืืื ืืืืืื ืื ืืืจ ื ืืฆืืช ืืฉืืืืฉ ื ืจืื ืืชืขืฉืืืช ื-IT ืืชืืืืื ืืื ืจืฉืชืืช ืืืจืชืืืช, ืืขืจืืืช ื ืื ืืื ืื, ื ืืชืื ืจืฉืชืืช IT, ืืืืฆืืช ืืืจืชืืืช, ืืืืฆืืช ืืืืฆืจืื ืืชืืื.
ืคืื ืงืฆืืื ืืืืช ืืกื ืื ืชืื ืื ืฉื ืืืจืคืื ื-SQL Server ืืชืืืื ืืชืจืืืฉืื ืฉืืื ืื ืชืื ืื ืงืฉืืจืื ืื ืืื ืืืื ืืืฉ ืืื ืงืฉืจืื ืืืืืจืื ืืืื.
ืืืื ื ืชืื ืื ืืจืคื
ืืจืฃ ืืื ืงืืืฆื ืฉื ืงืืืงืืืื (ืฆืืชืื) ืืงืฆืืืช (ืืืกืื, ืงืฆื). ืงืืืงืืืื ืืืืฆืืื ืืฉืืืืช, ืืงืฆืืืช ืืืืฆืืื ืงืฉืจืื ืฉืืชืืื ืืช ืฉืืื ืขืฉืืืืช ืืืืื ืืืืข.
ืืกื ื ืชืื ืื ืืจืคืื ืืืืื ืืฉืืืืช ืืืจืฃ ืืืืืจืชื ืืชืืจืช ืืืจืคืื. ืืื ื ื ืชืื ืื ืื ืงืืืงืืืื ืืงืฆืืืช. ืชืืื ืืช ืื ืชืืื ืืช ืฉื ืงืืืงืืืื ืืงืฆืืืช. ืืืืืจ ืืื ืืืืืจ ืฉื ืงืืืงืืืื.
ืื ืืืื ืืืืืืื ืืืจืื ืฉื ื ืชืื ืื, ืืกืื ื ืชืื ืื ืฉื ืืจืคืื ื ืืชื ืื ืขืืืคืืช ืืืืกืื ืืื ืืฉืืืืช. ืืื, ืืื ืฆืืจื ืืืฉื ืงืฉืจืื ืืืืฆืขืืช ืืคืชืืืช ืืจืื ืื ืื ืืืฆืขื ืืืจ. ื ืืชื ืืืฆืืจ ืืืืืื ืืืจืืืื ืฉื ื ืชืื ืื ืืืืฆืขืืช ืืคืฉืืืช ืงืืืงืื ืืงืฆืืืช ืืืื.
ืืขืืื ืืืืืจื ื, ืืฆืืจืช ืืขืจืืืช ืืืกืื ืืืจืฉืืช ืืื ืืงืืช ืืืจืืืืช ืืืชืจ ืืืืชืจ. ืืื ืืืืื ืงืฉืจืื, SQL Server 2017 ืืฆืืข ืืืืืืช ืืกื ื ืชืื ืื ืืจืคืื. ืืงืืืงืืืื ืืืงืฆืืืช ืฉื ืืืจืฃ ืืืืฆืืื ืืกืืืื ืืืฉืื ืฉื ืืืืืืช: NODE ื-EDGE. ืฉืืืืชืืช ืืจืคืื ืืฉืชืืฉืืช ืืคืื ืงืฆืืืช T-SQL ืืืฉื ืืฉื MATCH(). ืืืืืื ืฉืคืื ืงืฆืืื ืืืืช ืื ืืืื ืืช ืืชืื SQL Server 2017, ื ืืชื ืืืฉืชืืฉ ืื ืืืกืืกื ืื ืชืื ืื ืืงืืืืื ืฉืื ืืื ืฆืืจื ืืืืจื ืืืฉืื.
ืืืชืจืื ืืช ืฉื ืืืื ืืืจืฃ
ืืืื, ืขืกืงืื ืืืฉืชืืฉืื ืืืจืฉืื ืืืฉืืืื ืืืืคืืื ืืืืชืจ ืืืืชืจ ื ืชืื ืื, ืชืื ืฉืื ืืฆืคืื ืืืืฆืืขืื ืืืืื ืืช ืืืืืื. ืืืฆืื ืื ืชืื ืื ืืืจืฃ ืืฆืืข ืืืฆืขื ื ืื ืืืืคืื ืืงืฉืจืื ืืืจืืืื. ืืืฉื ืื ืคืืชืจืช ืืขืืืช ืจืืืช ืืขืืืจืช ืืืฉืื ืชืืฆืืืช ืืืงืฉืจ ื ืชืื.
ื ืจืื ืฉืืืฉืืืื ืจืืื ืืืื ื ืืฉืืืืฉ ืืืกืื ื ืชืื ืื ืืจืคืื ืืขืชืื.
ืืืื ื ืชืื ืื: ืืืืื ืืืกื ืืืืื ืืจืฃ
ืืืืื
ื ืกืชืื ืขื ืืืืื ืืืื ื ืืจืืื ื ืขื ืืืจืจืืื ืฉื ืขืืืืื: ืขืืื ืืืืื ืืื ืื, ืื ืื ืืืืื ืืื ืื ืืืืจ ืืื'. ืืืชืื ืืืืจื ืืกืคืฆืืคืืช, ืขืฉืืืืช ืืืืืช ืื ืืกืคืจ ืจืืืช ืืืืจืจืืื ืื. ืืื ืืื ืฉืืกืคืจ ืืจืืืช ืืื, ืืืฉืื ืงืฉืจืื ืืืกื ื ืชืื ืื ืืืกื ืืืคื ืืงืฉื ืืืชืจ ืืืืชืจ. ืื ืงืฉื ืืืืืื ืืช ืืืืจืจืืื ืฉื ืืขืืืืื, ืืืจืจืืื ืืฉืืืืง ืื ืงืฉืจืื ืืจืฉืชืืช ืืืจืชืืืช. ืืืื ื ืจืื ืืืฆื SQL Graph ืืืื ืืคืชืืจ ืืช ืืืขืื ืฉื ืืืคืื ืืจืืืช ืฉืื ืืช ืฉื ืืืจืจืืื.
ืขืืืจ ืืืืื ืื ื ืืื ืืืื ื ืชืื ืื ืคืฉืื. ืืืื ื ืืฆืืจ ืืืื ืฉื ืขืืืืื EMP ืขื ืชืขืืืช ืืืืช EMPNO ืืขืืืื ื.ื.ืจ., ืืืฆืืื ืืช ืืืืื ืฉื ืืืืื ื (ืืื ืื) ืฉื ืืขืืื. ืื ืืืืืข ืขื ืืืืจืจืืื ืืืืืกื ืืืืื ืื ืื ืืชื ืืืฆืข ืฉืืืืชื ืืืืฆืขืืช ืขืืืืืช EMPNO ะธ ื.ื.ืจ..
ืืชืจืฉืื ืืื ืืฆืื ืืช ืืืชื ืืืื ืืื ื ืืจืืื ื ืขื ืืจืืข ืจืืืช ืฉื ืงืื ืื ืืฆืืจื ืืืืจืช ืืืชืจ. ืขืืืืื ืื ืืงืืืงืืืื ืฉื ืืจืฃ ืืืืื EMP. ืืืฉืืช "ืขืืื" ืืืืืจืช ืืขืฆืื ืขื ืืื ืืืืืืจ "ืืืืฉ" (ReportsTo). ืืืื ืื ืืจืฃ, ืงืืฉืืจ ืืื ืงืฆื (EDGE) ืืืืืจ ืฆืืชืื (NODE) โโืฉื ืขืืืืื.
ืืืื ื ืืฆืืจ ืืืื ืจืืืื EMP ืืืืกืืคื ืืช ืืขืจืืื ืฉื ืืืชืื ืืชืจืฉืื ืืขืื.
CREATE TABLE EMP
(EMPNO INT NOT NULL,
ENAME VARCHAR(20),
JOB VARCHAR(10),
MGR INT,
JOINDATE DATETIME,
SALARY DECIMAL(7, 2),
COMMISIION DECIMAL(7, 2),
DNO INT)
INSERT INTO EMP VALUES
(7369, 'SMITH', 'CLERK', 7902, '02-MAR-1970', 8000, NULL, 2),
(7499, 'ALLEN', 'SALESMAN', 7698, '20-MAR-1971', 1600, 3000, 3),
(7521, 'WARD', 'SALESMAN', 7698, '07-FEB-1983', 1250, 5000, 3),
(7566, 'JONES', 'MANAGER', 7839, '02-JUN-1961', 2975, 50000, 2),
(7654, 'MARTIN', 'SALESMAN', 7698, '28-FEB-1971', 1250, 14000, 3),
(7698, 'BLAKE', 'MANAGER', 7839, '01-JAN-1988', 2850, 12000, 3),
(7782, 'CLARK', 'MANAGER', 7839, '09-APR-1971', 2450, 13000, 1),
(7788, 'SCOTT', 'ANALYST', 7566, '09-DEC-1982', 3000, 1200, 2),
(7839, 'KING', 'PRESIDENT', NULL, '17-JUL-1971', 5000, 1456, 1),
(7844, 'TURNER', 'SALESMAN', 7698, '08-AUG-1971', 1500, 0, 3),
(7876, 'ADAMS', 'CLERK', 7788, '12-MAR-1973', 1100, 0, 2),
(7900, 'JAMES', 'CLERK', 7698, '03-NOV-1971', 950, 0, 3),
(7902, 'FORD', 'ANALYST', 7566, '04-MAR-1961', 3000, 0, 2),
(7934, 'MILLER', 'CLERK', 7782, '21-JAN-1972', 1300, 0, 1)
ืืชืืื ื ืืืื ื ืืชื ืืจืืืช ืืช ืืขืืืืื:
- ืขืืื ืขื EMPNO 7369 ืืฆืืืช ื-7902;
- ืขืืื ืขื EMPNO 7902 ืืฆืืืช ื-7566
- ืขืืื ืขื EMPNO 7566 ืืฆืืืช ื-7839
ืืขืช ื ืกืชืื ืขื ืืืฆืื ืืจืฃ ืฉื ืืืชื ื ืชืื ืื. ืืงืืืงืื ื-EMPLOYEE ืืกืคืจ ืชืืื ืืช ืืืื ืืืืืจ ืืขืฆืื ืขื ืืื ืืขืจืืช ืืืืกืื "ืืคืืคืื" (EmplReportsTo). EmplReportsTo ืืื ืฉื ืืงืฉืจ.
ืืืืช ืืงืฆื (EDGE) ืขืฉืืื ืืืืื ืื ืชืืื ืืช.
ืืืื ื ืืฆืืจ ืืืืช ืฆืืืช EmpNode
ืืชืืืืจ ืืืฆืืจืช ืฆืืืช ืืื ืื ืคืฉืื: ืืืืืื ืฆืืจ ืืืื ืืชืืืกืฃ ืขื ืืกืืฃ "AS NODE".
CREATE TABLE dbo.EmpNode(
ID Int Identity(1,1),
EMPNO NUMERIC(4) NOT NULL,
ENAME VARCHAR(10),
MGR NUMERIC(4),
DNO INT
) AS NODE;
ืืขืช ื ืืืจ ืืช ืื ืชืื ืื ืืืืื ืจืืืื ืืืืื ืืจืคืืช. ืึทืึผึธื INSERT ืืืกืืฃ ื ืชืื ืื ืืืืื ืืืกืืช EMP.
INSERT INTO EmpNode(EMPNO,ENAME,MGR,DNO) select empno,ename,MGR,dno from emp
ืืืืืช ืืฆืืชืื ืืขืืืื ืืืืืืช $node_id_*
ืืืื ืืฆืืืช ืืืืืกื ืืชืืจ JSON. ืฉืืจ ืืขืืืืืช ืืืืื ืื ืืืืืืช ืืช ืชืืื ืืช ืืฆืืืช.
ืืฆืืจืช ืงืฆืืืช (EDGE)
ืืฆืืจืช ืืืืช ืงืฆื ืืืื ืืืื ืืืฆืืจืช ืืืืช ืฆืืืช, ืืื ืฉืืฉืืืืฉ ืืืืืช ืืืคืชื "AS EDGE".
CREATE TABLE empReportsTo(Deptno int) AS EDGE
ืืขืช ื ืืืืจ ืงืฉืจืื ืืื ืขืืืืื ืืืืฆืขืืช ืขืืืืืช EMPNO ะธ ื.ื.ืจ.. ืชืจืฉืื ืืืื ื ืืืจืืื ื ืืจืื ืืืืจืืจ ืืืฆื ืืืชืื INSERT.
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 1),
(SELECT $node_id FROM EmpNode WHERE id = 13),20);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 2),
(SELECT $node_id FROM EmpNode WHERE id = 6),10);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 3),
(SELECT $node_id FROM EmpNode WHERE id = 6),10)
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 4),
(SELECT $node_id FROM EmpNode WHERE id = 9),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 5),
(SELECT $node_id FROM EmpNode WHERE id = 6),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 6),
(SELECT $node_id FROM EmpNode WHERE id = 9),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 7),
(SELECT $node_id FROM EmpNode WHERE id = 9),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 8),
(SELECT $node_id FROM EmpNode WHERE id = 4),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 9),
(SELECT $node_id FROM EmpNode WHERE id = 9),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 10),
(SELECT $node_id FROM EmpNode WHERE id = 6),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 11),
(SELECT $node_id FROM EmpNode WHERE id = 8),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 12),
(SELECT $node_id FROM EmpNode WHERE id = 6),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 13),
(SELECT $node_id FROM EmpNode WHERE id = 4),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 14),
(SELECT $node_id FROM EmpNode WHERE id = 7),30);
ืืืืช ืืงืฆื ืืืืืืจืช ืืืจืืจืช ืืืื ืืืจืืืช ืืฉืืืฉ ืขืืืืืช. ืจืืฉืื, $edge_id
- ืืืื ืงืฆื ืืฆืืจืช JSON. ืืฉื ืืื ืืืืจืื ($from_id
ะธ $to_id
) ืืืืฆืืื ืืช ืืงืฉืจ ืืื ืฆืืชืื. ืื ืืกืฃ, ืืงืฆืืืช ืืืืืื ืืืืืช ืืืคืืื ืื ื ืืกืคืื. ืืืงืจื ืฉืื ื ืื ืื ืืคืื ื.
ืชืฆืืืืช ืืขืจืืช
ืืชืฆืืืช ืืขืจืืช sys.tables
ืฉื ื ืืืจืื ืืืฉืื ืืืคืืขื:
- ืืื_ืงืฆื
- is_node
SELECT t.is_edge,t.is_node,*
FROM sys.tables t
WHERE name like 'emp%'
ssms
ืืืืืืงืืื ืืงืฉืืจืื ืืืจืคืื ืืืืงืืื ืืชืืงืืื Graph Tables. ืกืื ืืืืช ืืฆืืืช ืืกืืื ืื ืงืืื, ืืืืืงืื ืืืืช ืืงืฆื ืืกืืื ืืฉื ื ืขืืืืืื ืืืืืจืื (ืงืฆืช ืืื ืืฉืงืคืืื).
ืืืืื MATCH
ืืืืื MATCH ื ืืงื ื-CQL (Cypher Query Language). ืืืื ืืจื ืืขืืื ืืืฆืข ืฉืืืืชืืช ืขื ืืืคืืื ืื ืฉื ืืจืฃ. CQL ืืชืืื ืืืืืื MATCH.
ืชืืืืจ
MATCH (<graph_search_pattern>)
<graph_search_pattern>::=
{<node_alias> {
{ <-( <edge_alias> )- }
| { -( <edge_alias> )-> }
<node_alias>
}
}
[ { AND } { ( <graph_search_pattern> ) } ]
[ ,...n ]
<node_alias> ::=
node_table_name | node_alias
<edge_alias> ::=
edge_table_name | edge_alias
ืืืืืืืช
ืืืื ื ืกืชืื ืขื ืืื ืืืืืืืช.
ืืฉืืืืชื ืฉืืืื ืืฆืืื ืืช ืืขืืืืื ืฉืืืืื ืืืืืืื ืกืืืช' ืืืื ืื ืฉืื.
SELECT
E.EMPNO,E.ENAME,E.MGR,E1.EMPNO,E1.ENAME,E1.MGR
FROM
empnode e, empnode e1, empReportsTo m
WHERE
MATCH(e-(m)->e1)
and e.ENAME='SMITH'
ืืฉืืืืชื ืืืื ืืืืขืืช ืืืฆืืืช ืขืืืืื ืืื ืืืื ืืจืื ืืฉื ืืื ืขืืืจ Smith. ืื ืชืกืืจ ืืช ืืืฉืคื ืืืคื, ืื ืืชืืฆืื ืชืฆืื ืืช ืื ืืขืืืืื.
SELECT
E.EMPNO,E.ENAME,E.MGR,E1.EMPNO,E1.ENAME,E1.MGR,E2.EMPNO,e2.ENAME,E2.MGR
FROM
empnode e, empnode e1, empReportsTo m ,empReportsTo m1, empnode e2
WHERE
MATCH(e-(m)->e1-(m1)->e2)
and e.ENAME='SMITH'
ืืืืกืืฃ, ืืงืฉื ืืขืืืืื ืืื ืืืื ืืืืจื ืืฉืืืฉื.
SELECT
E.EMPNO,E.ENAME,E.MGR,E1.EMPNO,E1.ENAME,E1.MGR,E2.EMPNO,e2.ENAME,E2.MGR,E3.EMPNO,e3.ENAME,E3.MGR
FROM
empnode e, empnode e1, empReportsTo m ,empReportsTo m1, empnode e2, empReportsTo M2, empnode e3
WHERE
MATCH(e-(m)->e1-(m1)->e2-(m2)->e3)
and e.ENAME='SMITH'
ืขืืฉืื ืืืื ื ืฉื ื ืืืืื ืืื ืืืฉืื ืืช ืืืืกืื ืฉื ืกืืืช'.
SELECT
E.EMPNO,E.ENAME,E.MGR,E1.EMPNO,E1.ENAME,E1.MGR,E2.EMPNO,e2.ENAME,E2.MGR,E3.EMPNO,e3.ENAME,E3.MGR
FROM
empnode e, empnode e1, empReportsTo m ,empReportsTo m1, empnode e2, empReportsTo M2, empnode e3
WHERE
MATCH(e<-(m)-e1<-(m1)-e2<-(m2)-e3)
ืืกืงื ื
SQL Server 2017 ืืืกืก ืืช ืขืฆืื ืืคืชืจืื ืืจืืื ื ืฉืื ืืืฉืืืืช IT ืขืกืงืืืช ืฉืื ืืช. ืืืจืกื ืืจืืฉืื ื ืฉื SQL Graph ืืืืืื ืืืื. ืืคืืื ืืืจืืช ืืื ืืืืืืช, ืืฉ ืืืจ ืืกืคืืง ืคืื ืงืฆืืื ืืืืช ืืื ืืืงืืจ ืืช ืืืืืืืช ืฉื ืืจืคืื.
ืคืื ืงืฆืืื ืืืืช SQL Graph ืืฉืืืืช ืืืืืื ืืื ืืข SQL. ืขื ืืืช, ืืคื ืฉืืืจ ื ืืืจ, ื-SQL Server 2017 ืืฉ ืืช ืืืืืืืช ืืืืืช:
ืืื ืชืืืื ืืคืืืืืืจืคืืื.
- ืจืง ืืืืืจืื ืื-ืืืืื ืืื ื ืชืืืื.
- Edges ืื ืืืื ืืขืืื ืืช ืืขืืืืืช $from_id ื-$to_id ืืืืฆืขืืช UPDATE.
- ืกืืืจืืช ืืจื ืืืืืืืืช ืืื ื ื ืชืืืืช, ืื ื ืืชื ืืืฉืื ืืืชื ืืืืฆืขืืช CTE.
- ืืชืืืื ืืืืืืืงืื OLTP ืืืืืจืื ืืืืืืช.
- ืืืืืืช ืืื ืืืช (ืืืื ืืื ืืช ืืืจืกืช ืืขืจืืช), ืืืืืืช ืืงืืืืืช ืืืืืืืืืช ืืื ืืืช ืืื ื ื ืชืืืืช.
- ืื ื ืืชื ืืืฆืืืจ ืขื ืกืืื ืืืืืืช ืืืฉืชื ื ืืืื ื-NODE ืื EDGE.
- ืฉืืืืชืืช ืฆืืืืืช ืืกืื ื ืชืื ืื ืืื ื ื ืชืืืืช.
- ืืื ืืจื ืื ืืฉืฃ ืืฉืืจืื ืืืืืจ ืืืืืืช ืจืืืืืช ืืืืืืืช ืืจืคืื.
- ืืื ืืืฉืง ืืฉืชืืฉ ืืืฆืืช ืืจืคืื, ืืื ืืชื ืืืื ืืืฉืชืืฉ ื-Power BI.
ืงืจื ืขืื:
ืืงืืจ: www.habr.com