【问题标题】:How to remove opposite rows from SQL table如何从 SQL 表中删除相反的行
【发布时间】:2010-02-28 08:14:05
【问题描述】:

我有以下 SQL 表:

A|B
---
w|x
x|w
y|z
z|y

我可以构造一个查询,它会产生以下结果吗:

A|B
---
w|x
y|z

总而言之,我想将这两列视为无序集,这样 (a,b) == (b,a)。

【问题讨论】:

    标签: sql set unordered


    【解决方案1】:

    “最佳” 代码取决于数据库,但以下与 dbms 无关:

    SELECT      t.A,
                t.B
    FROM        my_table t
    LEFT JOIN   my_table t2
            ON  t.A = t2.B
            AND t.B = t2.A
            AND t.A < t.B
    WHERE       t2.A IS NULL
    

    【讨论】:

    • +1:我正要编辑我的答案并添加这个:) 不过使用t.A &gt; t.B 来获得指定的结果(w|x 而不是x|w)。
    • 该死的。我非常接近这个,我忽略了排序比较,所以我的结果总是为零。
    • 我会说w&lt;xy&lt;z,但我知道什么:)
    【解决方案2】:

    您可以尝试以下方法:

    SELECT LEAST(a,b) a, GREATEST(a,b) b
    FROM t
    GROUP BY LEAST(a,b), GREATEST(a,b)
    

    使用以下测试表t

    CREATE TABLE t ( a VARCHAR(1), b VARCHAR(1) );
    
    INSERT INTO t VALUES ('w','x'),('x','w'),('y','z'),('z','y');
    

    它返回:

    w  x
    y  z
    

    使用LEASTGREATEST 还可以确保返回w x 而不是x w

    【讨论】:

    • 不知道leastgreatest。好的。 distinct 也不能在这里工作吗?
    • 是的,DISTINCT 在这种情况下会返回相同的结果。你必须测试性能,但我想它会是一样的。
    猜你喜欢
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多