我有一个表a和一个表b我想连接,我只需要几个列,所以我认为从表a和表b创建子查询,然后连接它们会很好,就像我试图在下面说明的那样:
select * from (Select * from (SELECT A,B,C FROM table1 where A =4756937 and B=290) as a
join
(SELECT D,E,F FROM table2) as b
on a.A = b.E )as c
join
(SELECT G,H,I,J
FROM table2) as d
on c.F = d.H
order by A;
原因是
就像我说过的,我只想要列的子集
我可能需要一个特殊的数据子集,例如a=4756937
所以第一个问题是:这是反模式吗?或者数据库系统会优化查询吗?
第二个问题:其他程序员会喜欢这种风格吗?有什么好的理由去上sql课程吗?
最后一个问题:在我已经连接了表a和b之后的最后一个连接中,我再次连接了表d(也是表b的子查询)上的构造,因为表b中有重复项。
因此,我的查询的想法是从表a中获取一个特定的nr,并将其连接到表b中的键列wihtin nothing special:
但是表b还有另一个键列(b.f),它表示数据行有类似于“小兄弟行”的内容。这就是我加入表b(再次作为子查询)的原因:
所以问题又来了:我为这个用例所做的是合理的,性能方面的明智的,还是某种程度上落入了反模式?
1条答案
按热度按时间bihw5rsg1#
虽然我不会真的称之为反模式,但我确实认为分离查询部分更明智:
结果集
数据集
选择器
排序
不适用:聚合
所以我会考虑
为什么这会有好处?
它为查询优化器提供了最大程度的自由度
它将所有索引保留在所有范围内(不是所有rdbms都可以使用范围外索引,如果嵌套子查询的大小达到上限,mysql也是如此)
它是最具可移植性的sql:也许你想使用soemthing而不是mysql一次?
它具有可读性和可维护性:如果基础表的结构或结果集需求发生变化怎么办?