连接4个表的1列 - Mysql

时间:2011-04-25 18:26:09

标签: mysql join

我正在讨论我刚才写的一些SQL,它在一个公共ID列上加入了4个表。我对我的加入感到有些偏执,我希望有人可以为我清除这个简单的概念:

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

我是否需要所有这些AND条款,或者我可以消除最后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个中都是通用的,所以这里非常简单。

3 个答案:

答案 0 :(得分:0)

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

考虑它的一种更简单的方法是。

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

答案 1 :(得分:0)

使其更易于阅读的更好解决方案是使用ISO / ANSI Join语法:

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

答案 2 :(得分:0)

我同意您应该使用INNER JOIN语法,以便更容易理解。

但是您还应该记住,优化器可能会使用这些AND子句。如果不知道你的表是如何构建的,我无法肯定地说。但一般来说,如果您基于两列告诉数据库加入,它将尝试使用索引(如果存在)。如果使用“传递属性”替换那些,那么可能会使查询运行得更慢。

只是一个警告。这取决于您的特定表结构。

如果你测试它并且运行速度一样快,那可能没问题。但桌子在增长吗?可能会随着时间的推移而失败?我会对此感到担心,并在进行更改之前使用非常大的表进行测试。