T-SQL-困难的逻辑查询

时间:2014-01-20 15:01:26

标签: sql .net

我正在开展一个有趣的项目,我必须承认SQL不是我的强项。简而言之,我的问题是:

假设一个表包含共享特定关系的用户对。 (例如(约翰,玛丽,朋友),(玛丽,爱丽丝,朋友)) 有没有办法写一个查询,这会产生约翰的朋友的朋友,在这种情况下,爱丽丝,但没有返回玛丽的结果?并且这样的查询是否可以扩展到任意n长度,总是会产生一组对,因此排除了中间用户?

类似地: 一个可以产生的问题 - 约翰与爱丽丝有多少朋友? (在这种情况下,1)

或者 - 如果关系以同一个人开始和结束,有多少朋友属于同一类型的关系:(例如John,Mary,Alice,John - Friendship)。

我很抱歉,如果帖子听起来很愚蠢 - 我知道我以前从未担心SQL级别上的这类事情,其中​​SQL主要用于以报告的形式插入,更新和检索数据。 动态查询创建不是问题 - 我更感兴趣的是查询的架构逻辑。 这是不同的,我想知道在SQL中是否有办法或者我应该尝试在我的代码的业务级别中执行它(例如使用.NET)

非常感谢。

1 个答案:

答案 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 +记录,对于那种情况,你可能更适合构建树状结构。