查找相互交叉引用的记录

4
我希望从数据库表中提取所有互相交叉引用的行。
我的表包含两行:ref1和ref2。
表格示例:
ID  ref1  ref2
01    23    83
02    77    55
03    83    23
04    13    45

在这种情况下,我希望查询只返回01和03行,因为它们互相交叉参照。是否可以使用一个查询来实现,还是需要手动遍历整个表格?我正在使用MySQL。

只是为了澄清,您只需要直接的交叉引用,而不是涉及更多行的循环引用吗? - Joachim Isaksson
是的,只有直接交叉引用。 - user3950463
3个回答

7

1
select
    *
from
    tbl t1
where
    exists (
        select
            'x'
        from
            tbl t2
        where
            t1.ref1 = t2.ref2 and
            t1.ref2 = t2.ref1
    )

谢谢,我已经接受了另一个答案,它稍微简单一些。 - user3950463
@user3950463,您还没有选择任何答案,请阅读接受答案:它是如何工作的? - M Khalid Junaid

0

首先,让我在一个旨在表示树的表的上下文中呈现解决方案,但面临着这个问题(导致跨引用不再是树的一部分)。

注意:如果您的根树记录引用了自身,则需要将其过滤掉(a.id!= b.id),如下所示,仅保留交叉引用记录。

-- case of a tree(s)
select 
  a.id currentId, 
  b.id parentId, 
  b.parent_id grandParentId 
from my_table a 
join my_table b on 
  a.parent_id=b.id 
  and b.parent_id=a.id 
  and a.id!=b.id;

现在针对你的情况,上述查询可以被编写为(再次考虑允许引用自身的记录,我们添加and a.ref1!= b.ref2):

-- case of a graph(s)
select 
  a.ref1 theCurrent, 
  b.ref1 theRef, 
  b.ref2 theRefsRef 
from my_table a 
join my_table b on 
  a.ref2=b.ref1 
  and b.ref2=a.ref1 
  and a.ref1!=b.ref2;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接