mysql - 加入子查询,反模式?

标签 mysql sql sql-server

我有一个要连接的表 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;

原因是

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

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

第二个问题:其他程序员会喜欢这种风格吗?参加 SQL 类(class)有什么好的理由吗?

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

所以我的查询的想法是从表 a 中获取一个特定的 nr 并将它加入到表 b 的键列上,没有什么特别的: enter image description here

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

enter image description here

那么问题又来了:我为这个用例所做的事情是否合理且性能明智,或者我是否以某种方式陷入了反模式?

最佳答案

虽然我不会真的称它为反模式,但我确实认为将查询部分分开会更明智:

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

所以我会考虑类似的事情

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 以外的其他东西一次?
  • 它是可读和可维护的:如果基础表的结构或您的结果集要求发生变化怎么办?

关于mysql - 加入子查询,反模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52474857/

相关文章:

mysql - MySQL 中未显示带有 NULL 值的结果

MySQL/正则表达式 : Partial regexp match

mysql - 创建在插入期间用默认值替换 '-' 的表

sql - 想要透视表。并生成动态 SQL 字符串并执行

sql-server - 将 NULL 转换为空字符串 - 从字符串转换为 uniqueidentifier 时转换失败

c# - 使用 sp_executesql 运行时相同的 SQL 查询很快,如果在查询分析器中作为动态查询执行则非常慢,为什么?

php - PDO - 在表中仅显示 1 个结果,并非所有结果都具有相同的 ID

php - 如何在 woocommerce 产品页面的查询表单中添加“电话”字段

javascript - Sequelize 。如何在创建中使用不同的参数值

mysql - 插入选择查询