【问题标题】:Natural full outer join does not work in my SQL Server Management Studio自然完全外部联接在我的 SQL Server Management Studio 中不起作用
【发布时间】:2014-02-09 21:14:55
【问题描述】:

我正在使用 Microsoft SQL Server 2012。我有两个表 T1 和 T2,它们都有一个 ID 列。

当我在 Microsoft SQL Server Management Studio 中输入以下 SQL 语句时

select ID 
from T1 
natural full outer join T2

它产生了以下错误:

消息 102,第 15 级,状态 1,第 1 行
'T2' 附近的语法不正确。

但是,Microsoft SQL Server Management Studio 接受以下我认为是等效语句的语句:

select ID 
from T1 
full outer join T2 ON t1.ID = T2.ID

SQL Server Management Studio 不支持自然全外连接吗?

【问题讨论】:

  • Sql server 中没有自然连接,你必须通过使用 RIGHT、LEFT 或 FULL 连接等关键字明确告诉 sql server 你想要做什么连接
  • 您是否查看了广泛、免费的SQL Server Books Online documentation first?
  • 拒绝或接受查询的不是“SQL Server Management Studio”,而是 SQL Server(后端)

标签: sql sql-server sql-server-2012


【解决方案1】:

SQL Server/Transact SQL 根本不支持 Natural Join 语法。

顺便说一句,解析器并没有抱怨“自然”,因为它假定这是一个表别名:-)

【讨论】:

  • 我想我有几个后续问题。 “select ID from T1 full external join T2 ON t1.ID = T2.ID”和使用自然连接一样吗?另外,如何在不使用外连接的情况下编写等效语句?谢谢
  • 完全外连接和自然连接在定义上是不同的。这取决于你想要做什么。您可能已经知道自然连接是一种等值连接,但仅返回其中一个表中的列(如果存在相同的列名)。
【解决方案2】:

Sql server 中没有 Natural JOINS,你必须明确告诉 sql server 你想在哪些字段上加入表。

1) 使用ON 子句并显式使用两个表中的列名。

2) 或者在旧的 JOIN 语法中显式使用 WHERE 子句中两个表中的列名。

关于这个主题的另一个很好的答案 Read here

【讨论】:

  • 我对查询做了几个测试,我认为 select * from t1 left outer join t2 ON t1.ID = t2.ID 相当于 select * from t1, t2 WHERE t1.ID = t2.ID 你能确认这是真的吗?谢谢
  • 自然连接意味着如果两个表中有两个同名的列,则这些表将使用它们的列连接。无法保证哪些列将用于连接或更多表。非常不可靠和非常意外的结果。现在什么是 sql server 中的自然连接等价物,没有任何,sql server 不会连接两个表,除非它告诉哪些字段要连接这些表,并且您必须明确使用 LEFT、RIGHT 或 FULL 连接关键字来获得结果。
  • 如果你不使用任何关键字,如 LEFT RIGHT 或 INNER,sql server 中的另一件事,默认情况下 Sql server 执行 INNER JOIN,但对于任何其他类型的连接,你必须显式使用关键字 RIGHT、LEFT 或 FULL。
【解决方案3】:

似乎不支持自然连接但请查看论坛Microsoft ConnectStack Overflow

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-03
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 2014-01-21
    • 2011-12-23
    相关资源
    最近更新 更多