加入子查询,反模式?

t1qtbnec  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(220)

我有一个表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(再次作为子查询)的原因:

所以问题又来了:我为这个用例所做的是合理的,性能方面的明智的,还是某种程度上落入了反模式?

bihw5rsg

bihw5rsg1#

虽然我不会真的称之为反模式,但我确实认为分离查询部分更明智:
结果集
数据集
选择器
排序
不适用:聚合
所以我会考虑

SELECT -- Result set definition
  X.A AS A,
  X.B AS B,
  X.C AS C,
  Y.D AS D,
  Y.E AS E,
  Y.F AS F,
  Z.G AS G,
  Z.H AS H,
  Z.I AS I,
  Z.J AS J
FROM -- Dataset definition
  table1 AS X
  INNER JOIN table2 AS Y ON X.A=Y.E
  INNER JOIN table2 AS Z ON Y.F=Z.H
WHERE -- Selector
  X.A=4756937
  AND X.B=290
ORDER BY -- sorting
  X.A
;

为什么这会有好处?
它为查询优化器提供了最大程度的自由度
它将所有索引保留在所有范围内(不是所有rdbms都可以使用范围外索引,如果嵌套子查询的大小达到上限,mysql也是如此)
它是最具可移植性的sql:也许你想使用soemthing而不是mysql一次?
它具有可读性和可维护性:如果基础表的结构或结果集需求发生变化怎么办?

相关问题