使用匹配列自然加入MySQL

时间:2018-04-17 22:45:58

标签: mysql sql select natural-join

如果我有两个具有主键连接的表,即两个列具有相同的名称和相同的数据,然后我有一个列名称时间戳,如果两个表具有相同的名称,但根据其表的数据不同,该怎么办?我还能使用NATURAL JOIN吗?还是有一种解决方法,考虑到我需要在没有别名的情况下从两个表中使用SELECT *?

2 个答案:

答案 0 :(得分:1)

不要使用NATURAL JOIN!这是令人厌恶的。它甚至没有考虑到正确声明的外键关系。

您可能会发现USING子句很有用:

select . . .
from a join
     b
     using (pk);

NATURAL JOIN的另一个问题是未列出连接键。如果出现问题,这可能会使调试代码变得非常困难。您遇到了TIMESTAMP列的问题。

如果您使用USING,则可以使用SELECT *,而USING密钥只会在SELECT中出现一次。有时,这可能是一种便利。

答案 1 :(得分:0)

有许多修复,可以组合使用:

•确保每个数据元素名称在其架构中是unqiue。例如,不是依靠updated_date属性通过其出现在Companies表中的上下文来获取含义,而是将其命名为company_name_updated_date

•将实体属性和审核属性分离到不同的基表中,例如company_name表中的Companies和CompaniesAudit表中的company_name_updated_date。将它们放在不同的模式中也可能有意义。

•防御性地使用视图的代码:这可能是你应该做的事情无论如何。考虑应该为给定的一组用户(用例,应用程序等)提供哪些属性,创建一组视图以公开这些属性并根据需要授予权限。不要将审核列公开给不需要查看它们的用户。

•在查询中防御性地编码('在运行中'):使用已驱动的表格仅投影查询所需的列,因此如果将新列添加到现有列中,那么它就不会出现问题。 '突破变革'对于该查询。 〔实施例:

WITH c AS ( SELECT company_id, company_name FROM Companies ),
p AS ( SELECT employee_id, company_name FROM Payroll )
SELECT * FROM c NATURAL JOIN p;