4

2 つのフィールド (名前、関心) を持つテーブルがあり、同じ関心を持つすべてのペアを検索し、すべての重複とミラー化されたペアを削除したいと考えています。

次の SQL ステートメントを使用して、すべてのペアを見つけて重複を削除できます。

SELECT P1.name AS name1, P2.name AS name2, P1.interest 
FROM Table AS P1, Table AS P2
WHERE P1.interest = P2.interest AND P1.name <> P2.name;

しかし、ミラーリングされたペアを削除する方法がわかりません。つまり:

"wil","ben","databases"

"ben","wil","databases"

上記のステートメントを Matches というビューにしようとし、次のクエリを試みました。

SELECT * FROM Matches
WHERE name2 <> (select name1 from Matches);

ただし、ミラー化されたすべてのペアが削除されるわけではありません。

4

3 に答える 3

7

どちらのペアが(ben、will)と(will、ben)のどちらに固執するかを気にしないと仮定すると、私の好ましい解決策は次のことを行うことです。

DELETE p2 
FROM Pairs p1 
INNER JOIN Pairs p2 
    on p1.Name1 = p2.Name2 
    and p1.Name2 = p2.Name1 
    and p1.Interest = p2.Interest
    -- match only one of the two pairs
    and p1.Name1 > p1.Name2

Name1とName2が等しくなることは決してないという事実のために、最初のメンバーが2番目のメンバーよりも小さいペアが常に1つ存在する必要があります。その関係を使用して、重複を削除できます。

Name1とName2が等しくないという要件がなくなるため、関係の代理キーがある場合、これは特に簡単です。

編集:テーブルから削除したくないが、特定のクエリの結果から削除したい場合は、SELECTではなく同じパターンを使用しますDELETE

于 2013-02-27T05:37:33.107 に答える
3

私は同様の問題を抱えていましたが、以下のクエリがうまくいくという最初の答えを調べていることがわかりました

SELECT P1.name AS name1,P2.name AS name2,P1.interest 
FROM Table AS P1,Table AS P2
WHERE P1.interest=P2.interest AND P1.name>P2.name  
于 2014-05-06T11:48:14.910 に答える
2

Nameタプル のあるテーブルがあるとします。

 F1  F2           
Jon Smith          
Smith Jon

次に、このペアを削除するには、次のようなクエリを作成できます。

SELECT n1.F1, n1.F2         
FROM Name n1            
WHERE n1.F1 > (SELECT n2.F1  
                  FROM Name n2  
                  WHERE n1.F1=n2.F2)

だから使用する代わり<>

(SELECT * FROM Matches
WHERE name2 **<>** (select name1 from Matches);)

>または演算子を使用する<と、正常に動作するはずです。

于 2013-02-27T05:34:54.250 に答える