如何检测与SQL的交互?

时间:2018-09-19 00:54:06

标签: sql

我有一个SQL表,用于跟踪实体是否已交互。因此,例如,每一行都有一个唯一的键,交互的日期,实体和组号。如果两个实体曾经在同一组中,则它们已经交互。

我还有另一个表,其中存储了这些实体(具有唯一标识符,名称等)。

我需要一个查询,该查询告诉我谁与谁没有交互,最好分为两列,第一列是单个实体,第二列是与之不交互的所有实体的列表。

这可能吗?

预先感谢-我的SQL印章非常粗糙!

1 个答案:

答案 0 :(得分:0)

我已根据您的要求创建了两个表。可以在sql服务器上运行,不确定您的数据库。

显示所有交互的表和数据结果如下:

-- Entities
create table entity(e_id int, name varchar(20))
insert entity values (1,'tom'),(2,'dick'),(3,'harry')

-- Interactions
create table interaction(i_id int, e_id int, group_id int)
insert interaction values (1,1,1), (2,2,1)

-- Show all interaction
select distinct e1.name as n1, e2.name as n2
from interaction i
join interaction i2 on i2.group_id=i.group_id and i2.e_id!=i.e_id
join entity e1 on e1.e_id=i.e_id
join entity e2 on e2.e_id=i2.e_id

这给你这个:

n1      n2
dick    tom
tom     dick

然后为您提供想要的结果,此查询将完成此操作:

-- Final select
; with nlist as (
    select e1.name as n1, e2.name as n2
    from entity e1
    join entity e2 on e2.e_id<>e1.e_id
    where not exists (
        select * from interaction i1
        join interaction i2 on i2.group_id=i1.group_id
        where i1.e_id=e1.e_id
        and i2.e_id=e2.e_id
    )
)
SELECT n1,  No_Interaction = STUFF(
        (
        SELECT ',' + n2 
        FROM nlist t1
        WHERE t1.n1 = t2.n1
        FOR XML PATH ('')
        )
        , 1, 1, '') 
from nlist t2
group by n1;

结果是:

n1      No_Interaction
dick    harry
harry   tom,dick
tom     harry