如果我有两个带有主键联接的表,即两个列都有相同的名称和相同的数据,然后我有一个列名timestamp,它对两个表都有相同的名称,但是根据它们的表,数据不同。我还能用自然连接吗?或者是否有一种解决方法考虑到我需要在两个表中都使用select*,而不使用别名?
omqzjyyz1#
有许多修复程序,可以组合使用:•确保每个数据元素名称在其架构中都是unqiue。例如,与其依赖 updated_date 通过出现在句子中的上下文来获得意义的属性 Companies 表的名称 company_name_updated_date .•将实体属性和审计属性分离到不同的基表中,例如。 company_name 在 Companies 表和 company_name_updated_date 在companyesaudit表中。将它们放在不同的模式中也可能有意义。•使用视图进行防御性编码:这可能是您无论如何都应该做的事情。考虑一组给定的用户(用例、应用程序等)应该可以使用哪些属性,创建一组视图来公开这些属性,并根据需要授予特权。不要将审核列暴露给不需要查看它们的用户。•在查询中进行防御性编码(“动态”):使用驱动表仅投影查询所需的列,因此,如果向现有列中添加新列,则不会对该查询进行“破坏性更改”。exmaple公司:
updated_date
Companies
company_name_updated_date
company_name
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;
jdzmm42g2#
不要使用 NATURAL JOIN ! 这是可憎的。它甚至不考虑正确声明的外键关系。你可以找到 USING 有用的子句:
NATURAL JOIN
USING
select . . . from a join b using (pk);
另一个问题是 NATURAL JOIN 连接键未列出。如果出现问题,这会使调试代码变得非常困难。您遇到的问题是 TIMESTAMP 列。如果你使用 USING 你可以用 SELECT * 以及 USING 关键点只在列表中出现一次 SELECT . 有时,这是一种方便。
TIMESTAMP
SELECT *
SELECT
2条答案
按热度按时间omqzjyyz1#
有许多修复程序,可以组合使用:
•确保每个数据元素名称在其架构中都是unqiue。例如,与其依赖
updated_date
通过出现在句子中的上下文来获得意义的属性Companies
表的名称company_name_updated_date
.•将实体属性和审计属性分离到不同的基表中,例如。
company_name
在Companies
表和company_name_updated_date
在companyesaudit表中。将它们放在不同的模式中也可能有意义。•使用视图进行防御性编码:这可能是您无论如何都应该做的事情。考虑一组给定的用户(用例、应用程序等)应该可以使用哪些属性,创建一组视图来公开这些属性,并根据需要授予特权。不要将审核列暴露给不需要查看它们的用户。
•在查询中进行防御性编码(“动态”):使用驱动表仅投影查询所需的列,因此,如果向现有列中添加新列,则不会对该查询进行“破坏性更改”。exmaple公司:
jdzmm42g2#
不要使用
NATURAL JOIN
! 这是可憎的。它甚至不考虑正确声明的外键关系。你可以找到
USING
有用的子句:另一个问题是
NATURAL JOIN
连接键未列出。如果出现问题,这会使调试代码变得非常困难。您遇到的问题是TIMESTAMP
列。如果你使用
USING
你可以用SELECT *
以及USING
关键点只在列表中出现一次SELECT
. 有时,这是一种方便。