跨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个中都是公共的,所以在这里非常简单。
答
更好的解决方案,使其更容易阅读是使用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
答
我同意你应该使用INNER JOIN
语法,使其更容易遵循。
但是你也应该记住,那些AND子句可能被优化器使用。不知道你的桌子是如何建造的,我不能肯定地说。但总的来说,如果您告诉数据库基于两列进行连接,它将尝试使用索引(如果存在)。如果您使用“传递属性”来替换那些,那么您可能会使查询运行速度变慢。
只是一个警告。这取决于你的具体表结构。
如果您测试了它,并且运行速度同样快,那可能就没有问题。但是桌子在增长吗?它可能会随着时间的推移失败?我会担心这一点,并在进行更改之前使用非常大的表格进行测试。
连接完全依赖于您的表结构。一个适当规范化的设计不会有表A/C,A/D和B/D直接相互依赖,但只通过链接表间接依赖。 – 2011-04-25 18:27:34