在SQL中联接表时,为什么必须显式指定外键?

时间:2019-06-18 20:11:19

标签: sql sql-server hibernate

SQL Server知道基于外键的表依赖性,那么为什么必须显式指定JOIN ON外键?

真实世界的工作示例(此查询有效):

SELECT * FROM users
INNER JOIN roles ON users.role_id=roles.id

隐含示例(此查询无效)

SELECT * FROM users
INNER JOIN roles

SQL是否应该隐式正确地假设,如果未指定ON关键字,应该对外键进行联接吗?

我知道这样做的好处可能是微不足道的,但是在利用了Java Hibernate的查询语言之类的SQL API中的此功能之后,我看不到为什么不能将其内置到SQL中。


编辑

感谢您到目前为止的回答。尽管它们很有趣,但是它们都没有回答有关SQL Server的原始问题。

3 个答案:

答案 0 :(得分:3)

SQL 确实排序支持此概念。该标准包括natural join,SQL Server 很高兴未实现。这允许您执行以下操作:

SELECT *
FROM users u NATURAL JOIN
     roles r;

一个natural join没有on子句。

A,它所做的与您建议的有所不同。它不使用外键,而只是使用具有相同名称的列。我认为这很可恶,因为SQL确实具有显式的外键声明,这将是使用它们的正确位置。

答案 1 :(得分:2)

表之间具有多个外键关系是很正常的。

在这种情况下,当两个表之间有两个FK时,您希望数据库做什么。随机选择一个?

典型示例:

  • CLIENT
  • PURCHASE。由于购买发生在两个客户之间,因此需要两个FK来CLIENT seller_id buyer_id ,它们都指向CLIENT

答案 2 :(得分:1)

每次都会发生隐式操作,这会使准确地执行所需的操作变得更加困难。刚开始时自然连接似乎很快速,但是如果您必须对其进行调试,则必须弄清楚连接的工作方式。使用外键吗?只是名称相同的列吗?我现在正在使用NHIBERNATE,似乎团队中的每个人都很难用它来完成所需的工作。