mhs*_*kar 1 sql sql-server sql-server-2017 sql-server-2017-graph
我在SQL Server中使用图表。
这是我的桌子:
--Node Table
CREATE TABLE [dbo].[Users]
(
[ID] [int] NOT NULL Primary key,
[FName] [nvarchar](100) NULL,
[LName] [nvarchar](100) NULL
)AS NODE
--Edge Table
CREATE TABLE [dbo].[FriendsOf] AS EDGE
Run Code Online (Sandbox Code Playgroud)
如何选择User2的所有User1朋友和User2是User3的朋友,而User1和User3之间没有直接Edge关系。
我可以这样写这个查询:
select distinct
u1.FName + ' ' + u1.LName as FirstFullName,
u2.FName + ' ' + u2.LName as SecondFullName,
u3.FName + ' ' + u3.LName as ThirdFullName
from
Users u1, FriendsOf fo1, Users u2, FriendsOf fo2, Users u3
where
match(u1-(fo1)->u2-(fo2)->u3)
and not exists(select 1 from friendsof fof
where (fof.$from_id = u1.$node_id and fof.$to_id = u3.$node_id) or (fof.$from_id = u3.$node_id and fof.$to_id = u1.$node_id)
)
Run Code Online (Sandbox Code Playgroud)
但我想了解其他方式吗?
我想使用这样的代码:
select distinct u1.FName + ' ' + u1.LName as FirstFullName, u2.FName + ' ' + u2.LName as SecondFullName,u3.FName + ' ' + u3.LName as ThirdFullName
from Users u1 , FriendsOf fo1 , Users u2 , FriendsOf fo2 , Users u3 , FriendsOf fo3,, FriendsOf fo4
where match(u1-(fo1)->u2-(fo2)->u3) and (not match(u1-(fo3)->u3) or not match(u3(fo4)->u1))
Run Code Online (Sandbox Code Playgroud)
请帮我解决这个问题。
MATCH中的节点名称可以重复。换句话说,一个节点可以在同一查询中遍历任意次数。边缘名称不能在MATCH中重复。边可以指向任一方向,但必须具有明确的方向。MATCH模式不支持OR和NOT运算符。可以在WHERE子句中使用AND将MATCH与其他表达式组合。但是,不支持使用OR或NOT将其与其他表达式结合使用。找到2个同时是同一用户的朋友的用户
SELECT Person1.name AS Friend1, Person2.name AS Friend2
FROM user user1, friend friend1, user user2,
friend friend2, user user0
WHERE MATCH(user1-(friend1)->user0<-(friend2)-user2);
Run Code Online (Sandbox Code Playgroud)
这种模式也可以表示如下
SELECT user1.name AS Friend1, user2.name AS Friend2
FROM user user2, friend friend1, user user2,
friend friend2, user user0
WHERE MATCH(user1-(friend1)->user0 AND user2-(friend2)->user0);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
153 次 |
| 最近记录: |