【问题标题】:Join without specyfing primary and foreign key加入不指定主键和外键
【发布时间】:2015-06-18 19:41:56
【问题描述】:

是否有可能(例如在 MS SQL 中)以这样的方式执行 Join:

select p.* from Person p join Order o

默认情况下,数据库引擎可以查找这些表之间的任何关系并使用它而无需额外编写:

on p.ID = o.FK_Person

【问题讨论】:

  • 不确定你在问什么。当您加入时,您必须在某些字段上加入表格。不一定是 PK 或 FK,但大多数时候都是。
  • 我的意思是——我一直在写类似的查询。在编程中,你有很多东西可以让你少写 - 在这里你通常通过 PK 和 FK 加入,所以为什么默认它不会使用 PK 和 FK,如果没有指定/
  • 因为编程不是魔法。你必须知道你在做什么。
  • 你看到你在做什么 - 你看到了 db 图表 - 你在表之间有没有关系。我很惊讶这个基本且非常频繁的操作需要一直编写相同的代码,如果你可以说:'为我链接这些表(你知道怎么做)'
  • 将表格链接在一起的方法不止一种。除非您告诉它,否则您如何建议 SQL 执行此操作?你想让它猜测并给你错误的答案吗?

标签: sql sql-server


【解决方案1】:

不,您需要在两种方式中的一种中指定连接子句。

隐式连接表示法:

SELECT p.* 
FROM Person p, Order o
WHERE p.ID = o.FK_Person

或显式连接表示法:

SELECT p.* 
FROM Person p
INNER JOIN Order o
        ON p.ID = o.FK_Person

如果您不指定任何加入顺序,则任何服务器都不会加入任何内容。它在 SQL 标准中定义。

【讨论】:

  • 从技术上讲,您所说的隐式联接是交叉联接。它起作用的原因是 where 谓词。
  • @SeanLange 但是,该条件使其成为内部连接。例如查看这篇文章:stackoverflow.com/questions/44917/…
  • @SeanLange 在第一种情况下,每个连接都是笛卡尔积(为您交叉连接)。之后应用过滤器(内部连接),并且可能保留的外部行将被附加回来(例如左,右,完全连接)。 SQL Server 中的计划优化器将完全一样地执行这两个查询。只是符号不同。
  • @FabianBigler 对,它之所以有效,是因为 where 谓词过滤掉了不匹配的行。
  • @Ionic 如果将逗号分隔符更改为“交叉连接”并保留 where 子句,则它是相同的。默认情况下,当 sql server 遇到多个带有逗号分隔符的表时,它只是显式交叉连接的简写。
【解决方案2】:

是的,当使用非 ansi 连接时可能会以逗号分隔,如

select p.* from Person p , Order o

警告:结果将是两个表的笛卡尔积。ANSI 连接是不可能的。

谢谢

【讨论】:

  • 这是一个交叉连接。
  • 嗯,这将加入,是的,但正如您已经说过的那样,它将是笛卡尔联接,而不是真正的联接。这将产生很多开销。 :-D
  • @SeanLange 他已经在他的原始帖子中将其声明为笛卡尔积。笛卡尔积是交叉连接。 ;-)
  • 抛开语义 :-) 这很糟糕,不会满足 OP 的要求......这是两个表之间的神奇关系连接
  • @TheMadDBA 对。但我从未在任何数据库系统中听说过。即使有可能,它也有太多的副作用。我不会使用它,即使它是可能的。 ;-)
猜你喜欢
  • 1970-01-01
  • 2017-03-09
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
  • 2020-12-01
相关资源
最近更新 更多