【问题标题】:Natural join in SQL ServerSQL Server 中的自然连接
【发布时间】:2011-06-17 03:08:54
【问题描述】:

在最近的 Microsoft SQL Server 版本中是否支持 natural joins?或者是否有一个很好的替代方法可以让 SQL Server 根据引用完整性计算出本来在 ON 子句中的谓词?

【问题讨论】:

  • 自然连接不是基于参照完整性,而是基于通用列名。没有查询是基于完整性的,它基于(基本和查询结果)表的含义——在表中一行表示什么。不需要知道查询的约束。如果约束成立,则附加表达式返回的结果与可以使用的表达式相同,并且在不知道约束的情况下仍然可以使用。约束是为了让 DBMS 强制执行完整性。
  • 注意:ON 子句并不难写。您可以在 Rider / DataGrip 等 IDE 中使用自动完成功能

标签: sql sql-server join


【解决方案1】:

不,感谢幸运星

我不敢相信您会希望引擎为您猜测 JOIN

相关链接:

编辑,解释原因

  • JOIN(无论是 USING 还是 ON)清晰明确
  • 我应该能够为存储在表中的实体命名列,而不必担心在另一个表中调用什么列,而不会产生 NATURAL JOIN 副作用

this excellent answer 中引用Bill Karwin

我从不使用 NATURAL JOIN,因为我不喜欢 join 可以做一些我不打算仅仅因为某些列名的事情 存在于两个表中。

【讨论】:

  • 这只是猜测实现是否做得不好(列名)。 SQL Server 有一种定义引用的精确方式,因此它拥有创建准确谓词所需的所有信息是理所当然的。还是我弄错了?
  • 我同意@mrwaim,OP 询问是否可以这样做,而不是是否正确。
  • 推广很好,关于为什么 OP “做错了”的自鸣得意的评论是粗鲁的,而且是最大的 SO 问题之一,真的。它对用户想要用它做什么有什么不同?他们问了一个事实答案的问题,而不是你对他们方法的看法。 SO 还有其他部分。
  • 因粗鲁而被否决。一个设计良好的数据库模式适用于自然连接,如果我没记错的话,它是 ANSI SQL 92 的一部分。并不是说任何其他供应商似乎都非常关心该标准,但这并不意味着不支持它是正确的。
【解决方案2】:

使用Full Outer join 而不是自然连接。它对我有用。

【讨论】:

  • 那是完全不同的事情。
【解决方案3】:

MS SQL 不支持自然连接,也不支持使用 () 连接。您必须明确写下连接中使用的所有属性。

如果datamodel 更改,您必须更改所有手写的“自然连接”,并确保您的连接条件再次正常。

【讨论】:

    【解决方案4】:

    我不希望很快看到它。 Connect suggestion from 2006 的信息很少,除了:

    感谢您的反馈。我们将调查您对即将发布的版本之一的请求。

    并且只收到了大约 30 个赞

    【讨论】:

    • @gbn - 自然连接本身并不是一个坏主意。它不会“猜测”,也不会根据外键进行推断。它只匹配连接两侧的所有同名列。如果您要连接两个具有相同名称的列代表不同事物的表,我通常会将其视为损坏的模式;此外,它是一个选择加入功能 - 它不会惩罚或改变任何现有代码的解释。
    • 我更多的是考虑“Insertedby”和“InsertedOn”类型的列。或者,如果您没有在 Comment 列前加上表名,因此您有许多 Comment 列,而不是重言式 Thing.ThingComment 和 Stuff.StuffComment
    • @Damien_The_Unbeliever - 很抱歉不同意,但我认为 NATURAL JOIN 是一种非常糟糕的做法。您可能正在连接您注意到看到的列,并且您可以在多个表上拥有 IsActive、StatusID、Name、Description 等列,这并不意味着架构损坏。你可能会在没有注意到的情况下犯错误。它与 SELECT * 相同。对数据模型的简单更改,您正在更改您的过程结果集而没有注意到。将同名的列添加到另一个表中会自动更改您的 JOIN,而不会引起注意。
    猜你喜欢
    • 2013-04-13
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 2012-01-22
    相关资源
    最近更新 更多