【问题标题】:SQL Primary Key/Table JoiningSQL 主键/表连接
【发布时间】:2013-09-12 14:04:21
【问题描述】:

好的,这是一个相对简单的问题,我只需要确认一下。我很确定我知道答案,但我需要专家验证,因为我有强迫症。

无论如何,我想知道一个简单的 Inner Join 语句之间有什么区别 并简单地使用 where 子句将我匹配为 = 的表的主键设置为彼此。

示例:我写了这个

select a.CONTACT_ID, a.TRADE_REP as Rep_Trading_ID, p.CRD_NUMBER, c.FIRST_NAME, c.LAST_NAME
from dbo.REP_PROFILE p, dbo.REP_ALIAS a, dbo.CONTACT c
where 
c.CONTACT_ID = p.CONTACT_ID
and p.CONTACT_ID = a.TRADE_REP 
and a.PRIMARY_YN = 'y'

在我看来,这似乎执行完全相同的查询,就好像我要在表 c 和 p 之间创建内部联接以及在联系人 ID 上创建表 p 和 a 之间的另一个内部联接(联系人 ID 是我的主键几乎所有东西)

我说的对吗?我部分正确吗?我是完全无知的吗?任何验证都可以

【问题讨论】:

标签: sql sql-server join inner-join


【解决方案1】:

是一样的!

看看这两张表:

CREATE TABLE table1 (
  id INT,
  name VARCHAR(20)
);

CREATE TABLE table2 (
  id INT,
  name VARCHAR(20)
);

使用内连接的查询的执行计划:

-- with inner join

EXPLAIN PLAN FOR
SELECT * FROM table1 t1
INNER JOIN table2 t2 ON t1.id = t2.id;

SELECT *
FROM TABLE (DBMS_XPLAN.DISPLAY);

-- 0 select statement
-- 1 hash join (access("T1"."ID"="T2"."ID"))
-- 2 table access full table1
-- 3 table access full table2

以及使用 WHERE 子句的查询的执行计划。

-- with where clause

EXPLAIN PLAN FOR
SELECT * FROM table1 t1, table2 t2
WHERE t1.id = t2.id;

SELECT *
FROM TABLE (DBMS_XPLAN.DISPLAY);

-- 0 select statement
-- 1 hash join (access("T1"."ID"="T2"."ID"))
-- 2 table access full table1
-- 3 table access full table2

在我看来,使用 JOIN 更具可读性。

【讨论】:

  • 我同意可读性,并且我更喜欢使用 JOIN 语句,因为它在政治上看起来更正确。我只是想知道正在执行的基本操作是否相同,您先生已经向我展示了我正在寻找的内容,谢谢!
  • @AdamW:是的。我在答案中输入EXPLAIN 是错误的,因为它是针对 MySQL 的。但是你总是对 SQL Server 中的查询是如何执行有疑问的,你应该在 SQL Server Management Studio 中使用“显示估计的执行计划”。这样你就可以看到它是否缺少索引或者它是否是一个错误的查询。是优化查询的最佳方式。但是,答案仍然相同,JOIN(不是LEFT JOIN 或任何其他变体)和WHERE 的工作方式相同。
【解决方案2】:

是的,使用您提供的格式适用于 INNER JOINS。

但是当您到达 LEFT/RIGHT JOINS 时该怎么办?那么你就不能像这样在 where 子句中使用连接条件了。

如果我没记错的话,老派的语法应该是这样的

=* for LEFT JOIN

*= for RIGHT JOIN

您可能会发现以下文章很适合阅读(更具体地说,是各种 JOIN 类型)

Join (SQL)

【讨论】:

【解决方案3】:

使用JOIN 语法更容易阅读(一切都很明显,诸如此类)。它也被认为更灵活,因为将JOIN 更改为OUTER JOIN 非常容易且更具可塑性。

有关更多详细信息,请参阅此帖子(它是 MySQL,但出现/适用相同的问题):INNER JOIN ON vs WHERE clause

【讨论】:

    猜你喜欢
    • 2019-06-06
    • 2012-09-17
    • 2011-01-25
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 2018-10-20
    • 1970-01-01
    相关资源
    最近更新 更多