我有一张包含以下数据的表格:
sequence subSequence Note
1 1 'A'
1 2 'B'
2 1 'C'
2 4 'D'
2 4 'E'
2 3 'F'
3 3 'G'
3 3 'H'
3 3 'I'
以下查询返回sequence和subSequence组合大于1的行。
SELECT sequence,subSequence,count(*) AS _rowCount
FROM [MyTable]
GROUP BY sequence,subSequence
HAVING count(*)>1
结果:
sequence subSequence _rowCount
2 4 2
3 3 3
我想返回序列和子序列组合大于1的所有行。
结果:
sequence subSequence Note
2 4 'D'
2 4 'E'
3 3 'G'
3 3 'H'
3 3 'I'
我已尝试过以下查询,但执行时间过了很长时间,而且我不确定它是否正确。因此,我需要帮助优化它,或者纠正它或任何其他查询:
SELECT *
FROM [MyTable]
WHERE sequence IN
(SELECT sequence
FROM [MyTable]
GROUP BY sequence,subSequence
HAVING count(*)>1)
AND subSequence IN
(SELECT subSequence
FROM [MyTable]
GROUP BY sequence,subSequence
HAVING count(*)>1)
答案 0 :(得分:1)
SELECT [MyTable].*, MySubQuery.rowCount
FROM [MyTable]
JOIN (
SELECT sequence,subSequence,count(*) AS rowCount
FROM [MyTable]
GROUP BY sequence,subSequence
HAVING count(*)>1
) As MySubQuery
ON MySubQuery.sequence = [MyTable].sequence
AND MySubQuery.subSequence= [MyTable].subSequence
使用子查询并加入它。
如果这仍然很慢,我建议在sequence,subSequence
上创建索引,如下所示:
ALTER TABLE [MyTable]
ADD INDEX idxSeqSubSeq (sequence,subSequence);
这将让数据库引擎利用索引来避免查看它不需要考虑的行。
答案 1 :(得分:1)
使用窗口功能:
SELECT t.*
FROM (SELECT t.*,
COUNT(*) OVER (PARTITION BY sequence, subSequence) AS rowCount
FROM [MyTable]
) t
WHERE rowCount > 1;