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的原始问题。
答案 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,似乎团队中的每个人都很难用它来完成所需的工作。