我记得有人教我在 sql 中连接表时永远不要创建循环。
实际上,使用 Business Objects 它甚至可以告诉我我在 Universe 中定义的模式中是否存在循环。
我试图在网上搜索有关此声明的信息,但找不到引用资料。
为什么这样做很危险?
编辑:也许我太简洁了。
我的问题不是关于作为“FOR 循环”或类似循环的循环。 我在 SELECT 语句中谈论类似 WHERE 子句的内容:
WHERE TABLE1.foo = TABLE2.foo
AND TABLE2.bar = TABLE3.bar
AND TABLE3.baz = TABLE1.baz
如果绘制关系,您将在连接中看到“循环”。
从正确性和/或性能的角度来看,这是否危险?
感谢大家。
编辑 2:添加了一个示例。
我只是想了一个例子,也许它不是最好的,但我认为它有助于理解。
------------ ----------------- ----------------------
- DELIVERY - - DELIVERY_DATE - - DELIVERY_DETAILS -
------------ ----------------- ----------------------
- id - <--- - id - <----- date_id -
- company - |----- delivery_id - - product -
- year - - date - - quantity -
- number - ----------------- - datetime_of_event -
- customer - ----------------------
- ----------
1 <-----> N 1 <----> N
- 在 DELIVERY 表中,每次交付只出现一次
- 在 DELIVERY_TABLE 中,我们列出了处理交货的每个日期。因此,可能会在几天内准备好交货。
- 在最后一个表格中,我们有每次交付的详细信息。因此,在此表中,我们跟踪与交付准备相关的每个事件
因此,每对表的基数为 1:N。
连接非常简单:
DELIVERY.id = DELIVERY_DATE.delivery_id AND
DELIVERY_DATE.id = DELIVERY_DETAILS.date_id
现在,假设我想加入另一个表,其中我有一些关于特定日期交货的其他信息。 让我们定义它:
------------
- EMPLOYEE -
------------
- company -
- year -
- number -
- date -
- employee -
------------
现在连接应该是:
DELIVERY.id = DELIVERY_DATE.delivery_id AND
EMPLOYEE.company = DELIVERY.company AND
EMPLOYEE.year = DELIVERY.year AND
EMPLOYEE.number = DELIVERY.number AND
EMPLOYEE.date = DELIVERY_DATE.date
总而言之,我将结束让 EMPLOYEE 加入 DELIVERY 和 DELIVERY_DATE,加入循环。
我应该这样重写吗?
EMPLOYEE.company = DELIVERY.company AND
EMPLOYEE.year = DELIVERY.year AND
EMPLOYEE.number = DELIVERY.number AND
EMPLOYEE.date IN (SELECT date FROM DELIVERY_DATE d WHERE d.delivery_id = DELIVERY.id)
编辑 3:终于找到链接
像往常一样,当您放弃搜索链接时,您就会找到它。
所以, this article 说明一切。与Business Objects相关,但内容一般。
感谢大家的宝贵时间。
最佳答案
编辑:我从更新中看到这是一个特定于 BO 设计者的问题,其中一个表被多次使用,但 BO 自动组合连接子句,然后错误地(或者更确切地说,无意地)限制了结果集。这个问题实际上与循环本身无关,它实际上是关于在同一查询中的多个上下文中使用实体。我会在下面留下我原来的答案,即使它并没有真正解决 OP 的问题。
免责声明:这是一个非答案答案,因为它既是答案又是问题。它可能应该是评论,但除非你提出/回答问题,否则你不能发表评论,但既然我真的很想帮忙,我会尽我所能,即使这不是这里做事的方式。所以起诉我吧。
简短的回答是否定的,您不应该避免连接中的循环(或“循环”)。
更重要的是,构造查询是为了声明正确的逻辑条件以生成您要查找的数据。相同的逻辑条件通常可以通过多种不同的方式建立,因此有时问问一种方式是否比另一种方式更可取是有意义的。当性能很重要时,这会变得特别有趣。但首先也是最重要的是,查询必须返回正确的结果集。这是如何完成的取决于底层模式。这才是您真正应该关注的。
在您的示例中,为什么 EMPLOYEE 在 DELIVERY 表中发挥作用?你为什么要加入这些专栏?这意味着雇员与交货具有相同的“日期”是什么意思?我知道这是一个人为的例子,但我想说的是,连接是否在图中创建一个循环完全(好吧,主要)取决于特定结果集的逻辑含义 是。
在 JOIN 语法问题上,使用 JOIN...ON 子句比 WHERE 子句更可取,因为它将合并实体所需的操作与数据过滤操作分开。
关于sql - 我应该避免连接中的循环吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14082580/