2010-09-02 74 views
0
select record1.fname, record2.fname, record3.fname 
from record1, record2, record3 
where record1.country= record2.country 
or record1.country=record3.country 

如果您将使用内部连接和左侧连接,上述代码的等效查询是什么?我还没有那么熟悉join,但是如果只有两个表,我知道如何使用join。用三个表查询

回答

2

你应该开始使用官方的ANSI SQL连接语法 - 与内部连接这样的:

select 
    record1.fname, record2.fname, record3.fname 
from 
    record1 
inner join 
    record2 on record1.country= record2.country 
inner join 
    record3 on record1.country=record3.country 

采用这种方法,这是很容易切换到外部联接在需要的地方:

select 
    record1.fname, record2.fname, record3.fname 
from 
    record1 
left outer join 
    record2 on record1.country= record2.country 
left outer join 
    record3 on record1.country=record3.country 

因此,开始使用显式JOIN语法 - 不要只列出一堆表并在WHERE子句中定义连接条件 - 这已被弃用,并且在您阅读时不太清楚。

杰夫阿特伍德(这个网站背后的人之一)也有一个伟大的博客文章visualizing the join types - 强烈推荐和非常容易理解和“得到”什么类型,以及他们如何工作。

1

我把它作为一个内部连接查询而不是左连接的查询。左联接版本将是相同的,只是LEFT

SELECT r1.fname, 
     r2.fname, 
     r3.fname 
FROM record1 r1 
INNER 
JOIN record2 r2 
     ON r1.country = r2.country 
INNER 
JOIN record3 r3 
     ON r2.country = r3.country 

我也用的r1r2r3表的别名,至少对我来说,它使查询更容易阅读/更少更换INNER “忙”比使用表的全名作为别名。

1
-- INNER 
SELECT r1.fname, r2.fname, r3.fname 
FROM record1 r1 

    INNER JOIN record2 r2 ON r2.country = r1.country 
    INNER JOIN record3 r3 ON r3.country = r2.country 

-- LEFT OUTER 
SELECT r1.fname, r2.fname, r3.fname 
FROM record1 r1 

    LEFT OUTER JOIN record2 r2 ON r2.country = r1.country 
    LEFT OUTER JOIN record3 r3 ON r3.country = r2.country