考虑只有两个列的表格,例如col1
和col2
。
我希望找到最快的方法来计算col2
等于col2
列col1
列{(1}}等于给定值的所有行。
例如,考虑一下您要查找名字与姓氏相同姓氏的所有人姓名的情况' John'
答案 0 :(得分:3)
SELECT
t.*
FROM table t
JOIN table t2 ON t2.col2 = t.col2
WHERE t2.col1 = 'some value'
您需要在两列上都有索引才能获得良好的性能。
答案 1 :(得分:2)
基本上你需要这个查询:
select
t1.col1
from
table t1,
table t2
where
t2.col1='John' and
t1.col2=t2.col2
如果向col1,col2字段添加索引,它应该足够快。
如果您想为大量数据生成输出表,那么临时创建表可能是最快的。
答案 2 :(得分:0)
在SQL中,当你只是写下你想要的东西时,它通常是最快的。你想要tablex中所有记录,其中col2在某个集合中。这个集合都是col2,其中col1是'John'。
select * from tablex
where col2 in (select col2 from tablex where col1 = 'John');
col1上的索引可以帮助您快速找到John。 col2的索引将帮助您找到其他索引。
有多种方法可以选择所需的数据。现代dbms会查看您的查询并找到选择数据的最佳方法。因此,您可能重新编写查询,但dbms注意到它实际上是相同的查询并使用相同的执行计划。
所以你的第一个目标应该是:使查询可读。这里有两件事:找到John(内部查询),找到其他人(外部查询)。因此,您不要加入表,因为您只想查看tablex中具有某些姓氏的记录。在内部,dbms可以很好地决定将tablex与自身连接,然后再过滤。但这取决于dbms而且不必打扰你。 (虽然很高兴知道你可以通过自联接,存在子句以及其他方式实现相同的目标。)