我记得我被教导在 sql 中加入表时永远不要创建循环。实际上,使用业务对象它甚至可以告诉我在 Universe 中定义的模式中是否存在循环。
我试图在网上搜索有关此声明的信息,但找不到参考。
为什么这样做很危险?
编辑:也许我太简洁了。
我的问题不是关于作为“FOR LOOP”或类似的循环。我在 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:终于找到了一个链接
像往常一样,当您放弃搜索链接时,您会找到它。
所以,这篇文章解释了一切。它与业务对象相关,但内容是通用的。
感谢大家的时间。