加入Subquerys,antipattern?

问题描述 投票:1回答:1

我有一个表A和一个表B,我想加入,我只需要几列,所以我认为从表a和b创建subquerys然后加入它们就像我试图在下面说明一样:

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;

原因是

  1. 就像我已经说过的,我想只有一个列的子集
  2. 我可能想要一个特殊的数据子集,例如A = 4756937

所以第一个问题是:这是反模式吗?或者数据库系统是否会优化查询?

第二个问题:其他程序员会如何喜欢这种风格?有什么理由去做SQL课程吗?

最后一个问题:在我已经加入表a和b之后的最后一个连接中,我再次在表d上加入了构造(这也是表b的子查询),因为我在表b中有重复项。

所以我的查询的想法是从表a获得一个特定的nr并在关键列wihtin表b上加入它没什么特别的:enter image description here

但是表b还有另一个键列(b.f),表示数据行有类似“小兄弟行”的内容。这就是为什么我加入表b(再次作为子查询):

enter image description here

所以再一个问题:我为这个用例做了什么合理的,性能明智的智能还是我不知何故陷入反模式?

mysql sql sql-server
1个回答
6
投票

虽然我不会把它称为反模式,但我认为分离查询部分更明智:

  • 结果集
  • 数据集
  • 选择
  • 排序
  • 在你的情况下不适用:聚合

所以我会考虑类似的事情

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:也许你想使用MySQL以外的其他东西?
  • 它是可读和可维护的:如果基础表的结构或结果集要求发生变化怎么办?
© www.soinside.com 2019 - 2024. All rights reserved.