-1

異なる id1 値間で id2 値間の共起をカウントする 2 つの SQL クエリがあります。サンプルテーブルは次のようになります

id1 | id2
101 | 1
101 | 2
101 | 3
102 | 2
102 | 3
102 | 4
103 | 15
103 | 3
103 | 4

目的の出力は次のとおりです。

A  B Count
1  2 1
1  3 2
2  3 4
1  4 2
2  4 3
3  4 4
1 15 1
2 15 2
3 15 2
4 15 1

両方のソリューションを以下に貼り付けます。

-- Solution 1
SELECT bar.id2 AS A, foo.id2 AS B, COUNT(*) AS Count
FROM
  (SELECT * FROM TestTab) AS bar,
  (SELECT * FROM TestTab) AS foo
WHERE bar.id1 <> foo.id1
  AND bar.id2 < foo.id2
GROUP BY bar.id2, foo.id2

-- Solution 2
SELECT bar.id2 AS A, foo.id2 AS B, COUNT(*) AS Count
FROM TestTab AS bar
JOIN TestTab AS foo
  ON bar.id1 <> foo.id1
WHERE bar.id2 < foo.id2
GROUP BY bar.id2, foo.id2

どちらのクエリも小さなテーブル (つまり、100 ~ 1000 行) ではうまく機能しますが、もっと大きなテーブル (たとえば、100.000 行) をクエリする必要があります。クエリを高速化し、パフォーマンスを向上させる方法を知りたいです。ご指摘ありがとうございます。

- Create table TestTab and insert dummy data
CREATE TABLE TestTab
INSERT INTO TestTab VALUES
  (101,1),
  (101,2),
  (101,3),
  (102,2),
  (102,3),
  (102,4),
  (103,15),
  (103,3),
  (103,4)
4

2 に答える 2

3

TestTabにインデックスを追加してid2(インデックスがまだ存在しない場合)、次のコマンドを実行することをお勧めします。

select distinct id2 into #id2 from TestTab;

SELECT bar.id2 AS A, foo.id2 AS B, COUNT(*) AS Count
FROM #id2 AS bar
JOIN #id2 AS foo ON bar.id2 < foo.id2
JOIN TestTab AS buz ON bar.id2 = buz.id2
JOIN TestTab AS fuz ON foo.id2 = fuz.id2
WHERE buz.id1 <> fuz.id1
GROUP BY bar.id2, foo.id2;

(id2 の個別の値を持つテーブルが既にある場合は、一時テーブルの作成をスキップし、代わりにそれを使用してください。)

于 2013-04-23T16:52:49.980 に答える