我有一个SQL表,用于跟踪实体是否已交互。因此,例如,每一行都有一个唯一的键,交互的日期,实体和组号。如果两个实体曾经在同一组中,则它们已经交互。
我还有另一个表,其中存储了这些实体(具有唯一标识符,名称等)。
我需要一个查询,该查询告诉我谁与谁没有交互,最好分为两列,第一列是单个实体,第二列是与之不交互的所有实体的列表。
这可能吗?
预先感谢-我的SQL印章非常粗糙!
答案 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