是否有太多左手加入代码味道?

Ryu*_*Ryu 33 sql sql-server-2005 left-join

例如,如果您在查询中有> 5个左连接是代码味道有...

  • 你的设计出了什么问题?
  • 你在一个查询中做得太多了吗?
  • 你的数据库太规范化了吗?

Qua*_*noi 38

对于某些设计来说,它是完全合法的解决方案.

假设您有一对多关系的层次结构,如Customer- Order- Basket- Item- Price等,可以在任何级别上填充:a Customer可能没有Orders,a 可能Order没有Baskets,等等.

在这种情况下,您可以发出如下内容

SELECT  *
FROM    Customer c
LEFT OUTER JOIN
        Order o
ON      o.CustomerID = c.ID
LEFT OUTER JOIN
        Basket b
ON      b.OrderID = c.ID
…
Run Code Online (Sandbox Code Playgroud)

请注意,在某些情况下它可能效率低下,并且可能会被替换为EXISTSNOT EXISTS(如果您只想知道相应的记录存在或在其他表中不存在).

有关性能详情,请参阅我的博客中的这篇文章

  • 当然.这就是为什么我写"可能被替换"而不是"应该不惜一切代价替换,永远不再使用":) (4认同)
  • 不存在vs join技术(我很喜欢)是一个很好的观点,但是连接可能是正确的. (3认同)

ann*_*ata 12

从某种意义上说,你可以/应该调查我会说是的.通过考虑一些观点,你可能会获得更好的效用和维护.

从某种意义上来说,它是"坏代码"否,这很容易合理,特别是对于大型数据库而言,现代数据库可能会优化任何低效率.


Eoi*_*ell 8

不管怎么说都没关系,但是如果你发现自己一遍又一遍地使用相同的连接来编写相同的查询/过程,那么它可能是创建视图的候选者,只是为了简化你将来的查询,以及如果您进行架构更改,请减少需要更改的触摸点数量


Sam*_*ron 7

很多时候你可以通过创建帮助器视图来减轻视觉气味,我认为没有一个严格的快速规则确定有多少左连接被认为是坏的.

与过程编码不同,将SQL分解成一些小块可能会导致查询效率低下.