跨4个表加入1列 - Mysql

问题描述:

我正在回顾一些前段时间写到的SQL,它将4个表加入公共ID列。我开始有点偏执约我加盟,我希望有人能清楚只是这个简单的概念对我:跨4个表加入1列 - Mysql

SELECT A.adata, B.bdata, C.cdata, D.ddata 
FROM taba A, tabb B, tabc C, tabd D 
WHERE A.id=B.id AND B.id=C.id AND C.id=D.id 
AND A.id=C.id AND A.id=D.id AND B.id=D.id 

我需要所有这些和条款,或者我可以消除过去的3,这样:

SELECT A.adata, B.bdata, C.cdata, D.ddata 
FROM taba A, tabb B, tabc C, tabd D 
WHERE A.id=B.id AND B.id=C.id AND C.id=D.id 

虽然我已经成功地测试了我的数据集较小的查询,它似乎产生相同的结果,我不希望有一些不完整的SQL回来困扰我。另一方面,我不想加载不必要的条件。让我知道我是否可以提供更多信息。

- 更新,谢谢大家的答案。关于表格:它们相对静态,尽管行中的一些值在整个一天中都会改变。每个表A,B,C,D存储关于OBJECT的不同信息,并且OBJECT ID在所有4个中都是公共的,所以在这里非常简单。

+1

连接完全依赖于您的表结构。一个适当规范化的设计不会有表A/C,A/D和B/D直接相互依赖,但只通过链接表间接依赖。 – 2011-04-25 18:27:34

更好的解决方案,使其更容易阅读是使用ISO/ANSI加入语法:

Select A.adata, B.bdata, C.cdata, D.ddata 
From taba As A 
    Inner Join tabb As B 
     On B.id = A.id 
    Inner Join tabc As C 
     On C.id = B.id 
    Inner Join tabd As D 
     On D.id = C.Id 
+0

我喜欢这个,但是你不会把所有的关键字都大写吗? – colinmarc 2011-04-25 18:45:29

+0

@colinmarc - 这是一种文体偏好。国际海事组织不再被要求的一个,使它更难以阅读和难以打字。 – Thomas 2011-04-25 18:47:16

+0

我很同意打字,但绝对不容易阅读。对每个他自己我猜=) – colinmarc 2011-04-25 18:48:55

您的第二个版本利用表列之间的transitive relationship

更简单的方法来思考它会。

A = 1B = A,因此B = 1

我同意你应该使用INNER JOIN语法,使其更容易遵循。

但是你也应该记住,那些AND子句可能被优化器使用。不知道你的桌子是如何建造的,我不能肯定地说。但总的来说,如果您告诉数据库基于两列进行连接,它将尝试使用索引(如果存在)。如果您使用“传递属性”来替换那些,那么您可能会使查询运行速度变慢。

只是一个警告。这取决于你的具体表结构。

如果您测试了它,并且运行速度同样快,那可能就没有问题。但是桌子在增长吗?它可能会随着时间的推移失败?我会担心这一点,并在进行更改之前使用非常大的表格进行测试。