我有两个SQL查询来计算不同id1值之间的id2值之间的同现现象。样本表看起来像使用SQL Server缓慢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)
一般规则:where/join/group子句中使用的任何字段都应该有一个索引。 – 2013-04-23 15:53:06
作为一个轻微抛开,我建议使用“INNER JOIN”你想排除NULL的地方 - 这也会强制使用ON子句。 – penguat 2013-04-23 16:01:32
你有另外一张只有id2值的表吗?如果是的话,它叫什么? – 2013-04-23 16:05:35