代码之家  ›  专栏  ›  技术社区  ›  tcurdt

在表中查找双向连接

sql
  •  1
  • tcurdt  · 技术社区  · 17 年前

    我有以下SQL结果集(作为join fwiw的结果):

    A,C
    B,E
    C,A
    D,A
    

    每个值代表一个节点。因此,所涉及的节点集是A、B、C、D、E。每一行描述一个有向边。

    A -> C
    B -> E
    C -> A
    D -> A
    

    当然,这可以简化为

    A <-> C
    B -> E
    D -> A
    

    现在,我想过滤掉没有双向对应的行。所以最终的结果集应该是

    A,C
    C,A
    

    A,C
    

    在这种情况下。

    我正在寻找用SQL表示这一点的最佳方法。

    3 回复  |  直到 17 年前
        1
  •  1
  •   cletus    17 年前

    设想一个表节点,其列为node1和node2。

    SELECT node1, node2
    FROM nodes n
    WHERE EXISTS (SELECT 1 FROM nodes WHERE node1 = n.node2 AND node2 = n.node1)
    

    当然,您需要确保其适当的索引,即:

    (node1, node2)
    

    (node2, node1)
    

    这仍然会使您得到A、C和C、A。要筛选这些内容,请将查询更改为:

    SELECT node1, node2
    FROM nodes n
    WHERE EXISTS (SELECT 1 FROM nodes WHERE node1 = n.node2 AND node2 = n.node1)
    AND node1 < node2
    

    假设有一个自然的顺序,你可以利用。

        2
  •  0
  •   shahkalpesh    17 年前
    
    -- Temp table creating to insert example rows
    SELECT 
    'A' AS Col1, 'C' AS Col2
    INTO #TEMP
    UNION
    SELECT 'B', 'E'
    UNION
    SELECT 'C', 'A'
    UNION
    SELECT 'D', 'A'
    
    
    SELECT A.* FROM #TEMP A, #TEMP B
    WHERE (A.COL1 = B.COL2 AND A.COL2 = B.COL1)
    
    
    
        3
  •  0
  •   John Fouhy    17 年前

    内部将节点对连接到自身?

    select node1, node2
    from nodes n
    inner join nodes n2
    on n.node1 = n2.node2 and n.node2 = n2.node1
    

    (将“nodes”替换为子查询)