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