好吧,这是一个相对简单的问题,我只需要确认。我很确定我知道答案,但我需要专家验证,因为我有强迫症。
无论如何,我想知道一个简单的内连接声明之间有什么区别 并简单地使用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是我的主键绝大多数)
我说错了吗?我部分正确吗?我是无知的无知吗?任何验证都可以
答案 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类型中)
答案 2 :(得分:0)
执行JOIN
语法更容易阅读(一切都很明显,其中的内容和类似的东西)。它也被认为更灵活,因为将JOIN
更改为OUTER JOIN
非常容易且更容易修复。
有关更多详细信息,请参阅此帖子(它是MySQL,但同样的问题出现/适用):INNER JOIN ON vs WHERE clause