table - Network_Users
間の接続を含む がありますusers
。相互にリンクしているすべてのユーザーを選択できるクエリを考案しようとしています。したがって、userId-relatedUserId
関連するUserId-userId関係でもある各関係。
ユーザー
userId
Network_Users
userId
relatedUserId
誰でもこれを行う良い方法を提案できますか?
select *
from network_users a,
network_users b
where a.userid = b.relateduserid
and b.userid = a.relateduserid
古風な結合構文についてお詫び申し上げます。自己結合については、もう少し明確です。
二重関係を見つけたい場合はこれを使用してください
Select
*
From NetworkUser As N1
Inner Join NetworkUser As N2 On
( N1.UserId = N2.RUserId And N1.RUserId = N2.UserId )
グラフ内のすべての関係を選択する場合は、このコードを使用できます
WITH REU AS
(
Select
NU.UserId ,
NU.RUserId ,
UserIdMap = Convert(varchar(max), NU.UserId) + '->' + Convert(varchar(max), NU.RUserId)
From NetworkUser As NU
--Where
--( NU.RUserId Not In ( Select NUSub.UserId From NetworkUser As NUSub ) ) -- Find Last Nodes
Union All
Select
NU.UserId ,
NU.RUserId ,
UserIdMap = Convert(varchar(max) , NU.UserId ) + '->' + REU.UserIdMap
From NetworkUser As NU
Inner Join REU On
( NU.RUserId = REU.UserId )
And
( CHARINDEX( Convert(varchar(max) , NU.UserId ) , REU.UserIdMap ) <= 0 ) -- Stop Loop
)
SELECT *
FROM REU
Go
GO
/****** Object: Table [dbo].[NetworkUser] Script Date: 3/17/2013 8:09:41 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[NetworkUser](
[UserId] [int] NOT NULL,
[RUserId] [int] NOT NULL,
CONSTRAINT [PK_NetworkUser] PRIMARY KEY CLUSTERED
(
[UserId] ASC,
[RUserId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[Users] Script Date: 3/17/2013 8:09:46 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Users](
[UserId] [int] NOT NULL,
[Name] [nvarchar](50) NULL,
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED
(
[UserId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
そして、あなたはこのような結果を得ることができます
4->8
6->8
7->8
1->7->8
3->7->8
6->7->8
5->6->7->8
2->5->6->7->8
4->5->6->7->8
3->4->5->6->7->8