SQL主键/表连接

时间:2013-09-12 14:04:21

标签: sql sql-server join 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之间创建和内部连接以及表p之间的另一个内部联接和联系人ID上的内部联接(联系人ID是我的主键绝大多数)

我说错了吗?我部分正确吗?我是无知的无知吗?任何验证都可以

3 个答案:

答案 0 :(得分: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更具可读性。

答案 1 :(得分:0)

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

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

现在如果我没有弄错的话,旧学校的语法就像是

=* for LEFT JOIN

*= for RIGHT JOIN

您可能会对以下文章进行更好的阅读(更具体地说,在各种JOIN类型中)

Join (SQL)

答案 2 :(得分:0)

执行JOIN语法更容易阅读(一切都很明显,其中的内容和类似的东西)。它也被认为更灵活,因为将JOIN更改为OUTER JOIN非常容易且更容易修复。

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

相关问题