Как выбрать из таблицы графиков SQL Server, когда предложение не совпадает - PullRequest
0 голосов
/ 26 июня 2018

Я использую таблицу графиков в 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

Как выбрать всех пользователей User1 и User2, а 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)
 )

, но я хочу понять по-другому?

Я хочу использовать такой код:

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

Пожалуйста, помогите мне решить эту проблему.

1 Ответ

0 голосов
/ 26 июня 2018

Имена узлов внутри MATCH могут повторяться.Другими словами, узел может проходить произвольное количество раз в одном и том же запросе.Имя ребра не может повторяться внутри MATCH.Ребро может указывать в любом направлении, но оно должно иметь явное направление.Операторы OR и NOT не поддерживаются в шаблоне MATCH.MATCH можно комбинировать с другими выражениями, используя AND в предложении WHERE.Однако объединение его с другими выражениями с использованием 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);

этот шаблон также может быть выражен как ниже

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