0

如果我有两个具有主键连接的表,即两个列具有相同的名称和相同的数据,然后我有一个列名时间戳,这两个表的名称相同,但根据它们的表不同的数据。我还能使用 NATURAL JOIN 吗?或者考虑到我需要从两个表中使用 SELECT * 而不使用别名,是否有解决方法?

4

2 回答 2

1

不要使用NATURAL JOIN!这是可憎的。它甚至没有考虑正确声明的外键关系。

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

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

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

如果您确实使用USING,则可以使用SELECT *,并且这些USING键仅在SELECT. 有时,这可能是一种方便。

于 2018-04-17T22:51:02.813 回答
0

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

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

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

• 使用视图进行防御性编码:这可能是您无论如何都应该做的事情。考虑给定的一组用户(用例、应用程序等)应该可以使用哪些属性,创建一组视图来公开这些属性并根据需要授予权限。不要向不需要查看它们的用户公开审计列。

• 查询中的防御性代码('on the fly'):使用驱动表仅投影查询所需的列,因此,如果将新列添加到现有列,则它不是该查询的“重大更改”。示例:

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;
于 2018-04-26T11:13:23.290 回答