1

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

无论如何,我想知道只是一个简单的内部连接语句和简单地使用 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 是我几乎所有事情的主键)

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

4

3 回答 3

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 更具可读性。

于 2013-09-12T14:07:58.757 回答
0

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

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

现在,如果我没记错的话,旧学校的语法会像

=* for LEFT JOIN

*= for RIGHT JOIN

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

加入 (SQL)

于 2013-09-12T14:07:09.910 回答
0

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

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

于 2013-09-12T14:08:49.647 回答