我正在开展一个有趣的项目,我必须承认SQL不是我的强项。简而言之,我的问题是:
假设一个表包含共享特定关系的用户对。 (例如(约翰,玛丽,朋友),(玛丽,爱丽丝,朋友)) 有没有办法写一个查询,这会产生约翰的朋友的朋友,在这种情况下,爱丽丝,但没有返回玛丽的结果?并且这样的查询是否可以扩展到任意n长度,总是会产生一组对,因此排除了中间用户?
类似地: 一个可以产生的问题 - 约翰与爱丽丝有多少朋友? (在这种情况下,1)
或者 - 如果关系以同一个人开始和结束,有多少朋友属于同一类型的关系:(例如John,Mary,Alice,John - Friendship)。
我很抱歉,如果帖子听起来很愚蠢 - 我知道我以前从未担心SQL级别上的这类事情,其中SQL主要用于以报告的形式插入,更新和检索数据。 动态查询创建不是问题 - 我更感兴趣的是查询的架构逻辑。 这是不同的,我想知道在SQL中是否有办法或者我应该尝试在我的代码的业务级别中执行它(例如使用.NET)
非常感谢。
答案 0 :(得分:0)
假设这个表结构:
TABLE [dbo].[Pers](
[PersID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_Pers] PRIMARY KEY CLUSTERED
对于这些人,并且:
TABLE [dbo].[Rels](
[RelID] [int] IDENTITY(1,1) NOT NULL,
[RelFrom] [int] NOT NULL,
[RelTo] [int] NOT NULL,
CONSTRAINT [PK_Rels] PRIMARY KEY CLUSTERED
关于人(朋友)之间的关系。
有了这些数据:
PersID Name
1 John
2 Mary
3 Alice
RelID RelFrom RelTo
1 1 2
2 2 3
您可以使用此查询:
select p.Name,frofr.Name
from Pers as p
inner join Rels as f1 on f1.RelFrom=p.PersID
inner join Rels as f2 on f2.RelFrom=f1.Relto
inner join Pers as frofr on frofr.PersID=f2.RelTo
结果如下:
Name Name
John Alice
您可以根据需要创建任意数量的关系,但是对于每个级别,您应该扩展查询。 您可以为每个“朋友级别”创建视图。 我不会将它用于100K +记录,对于那种情况,你可能更适合构建树状结构。