多対多の関係R
があります (2 つの列バインディング テーブル、両方の列が同じテーブルへの外部キーです)。x, y
ここで、 と のようなすべてのペアを見つけたいと思いx,y in R
ますy,x in R
。テーブルに数十万行が含まれている場合、最速の方法は何ですか? 私はmysqlを使用しています。
質問する
59 次
3 に答える
2
SELECT LEAST(x, y) l, GREATEST(x, y) g
FROM r
GROUP BY
l, g
HAVING COUNT(*) > 1
于 2012-06-01T18:26:20.590 に答える
2
おそらく最速の方法は次のとおりです。
select (case when x < y then x else y end) as themin,
(case when x < y then y else x end) as themax
from (select distinct x, y from R) r
group by (case when x < y then x else y end), (case when x < y then y else x end)
having count(*) > 1
これにより x 値と y 値が並べ替えられるため、それらをグループ化すると、元の順序に関係なく正規の順序になります。
ペアがRテーブルですでに異なることがわかっている場合は、「個別の選択」を省くことができます。
別の方法は、ある種の自己結合です (明示的に、または IN または NOT IN を使用して)。いろいろな方法を試すことができますが、これがおそらく最速だと思います。
于 2012-06-01T18:29:39.323 に答える
0
自己結合を行います:
SELECT *
FROM R T1
INNER JOIN R T2
ON T1.X = T2.Y
AND T1.Y = T2.X
補遺
重複した行 (つまり、1, 2 と 2, 1) を返したくない場合は、次を使用できます。
SELECT *
FROM R T1
INNER JOIN R T2
ON T1.X = T2.Y
AND T1.Y = T2.X
WHERE T1.X < T1.Y;
ただし、重複する行を返したくない場合は、Quassnoi のソリューションの方がパフォーマンスが良いと思われますが、これはデータと指標によって異なります。
于 2012-06-01T18:25:49.647 に答える