sql - 我应该避免连接中的循环吗?

标签 sql database join business-objects

我记得有人教我在 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/

相关文章:

sql - MySQL - NULL 值检查和存储过程中的动态 SQL

sql - 德尔福/Access 选择 SQL 错误

mysql - SQL 内部连接 ​​3 个表

database - 该数据集的最佳数据库是什么?

database - RavenDB build #2127 客户端异常 : [Argument_StreamNotReadable] when trying to create a new Database

mysql - 将 IN 子查询重写为 JOIN

c# - MVC View 中显示的 Linq 连接查询

mysql - 从同一个表中选择不同条件的字段

mysql - 在 Mac OS 上升级到 MySQL 5.7 后恢复数据库吗?

MySQL 连接三个不同的结果并计数