2

以下のように3つのフィールドを持つテーブルがあります

id  a  b
1   1  2
2   1  3
3   2  1
4   2  3
5   3  1
6   3  2

(a,b) と (b,a) の両方がこのテーブルに存在します (a=1 と b=2 と a=2 と b=1)。上記のテーブルからすべての (b,a) を削除する必要があります。

Output:

id a b
1  1 2
2  1 3
4  2 3

私はこのような自己結合を試みました

select v1.id, v2.id from val v1,val v2 where v1.a=v2.b and v1.b=v2.a

一致する対応するIDを見つけました。が、これ以降は進めません。助けてください。

4

3 に答える 3

3

これらの重複レコードを完全に削除したい場合は、 DELETEMySQL の組み込み関数LEASTを使用するステートメントを次に示します。GREATEST

DELETE  a
FROM    tableName a
        LEFT JOIN
        (
            SELECT  LEAST(a, b) aa,
                    GREATEST(a,b) bb,
                    MIN(ID) min_ID
            FROM    tableName
            GROUP     BY aa, bb
        ) b ON a.ID = b.min_ID
WHERE   b.min_ID IS NULL

SELECT声明_

SELECT  *
FROM    tableName
WHERE   (LEAST(a, b),GREATEST(a,b), ID)
        IN
        (
            SELECT  LEAST(a, b) aa,
                    GREATEST(a,b) bb,
                    MIN(ID) min_ID
            FROM    tableName
            GROUP   BY aa, bb
        )
于 2013-02-24T09:30:59.387 に答える
0

これを実行して、必要な出力を選択できます。

select id, v1.a, v2.a from test v1 left join test v2 on (v1.id = v2.id and v1.a > v2.b)
where v2.id is null
于 2013-02-24T09:46:20.137 に答える
0

「半分」の結果のみを表示する場合:

SELECT *
FROM val
WHERE a <= b ;

残りの半分を削除する場合は、次のようにします。

DELETE *
FROM val
WHERE a > b ;
于 2013-02-24T09:56:02.833 に答える