2013-04-13 44 views
13

是否可以向我解释关于连接的内容?加入SQL中的多个表格

内部连接根据条件选择公共数据。

LEFT OUTER JOIN选择所有的数据从左边不论是共同但有右表和右外反之亦然需要共同的数据。

我知道的基本知识,但问题保持当谈到加入比5,8,10桌。

假设我有10个表加入。如果我有第一个5个表的内连接,现在尝试应用第六个表的左连接,现在查询将如何工作?

我的意思是说现在的结果集前5代表将被视为左表和第六届一个将considerded为右表?或者只有第五张桌子被认为是左边和第六张?请帮助我解决这个问题。

+1

[SQL加入的可视化表示](http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html) –

+0

@JohnWoo这篇文章是由它的repuditated作者在评论中。维恩图并未说明一般连接与其输入的关系。 – philipxy

回答

17

当连接多个表时,每个连接的输出在逻辑上形成一个虚拟表,进入下一个连接。

所以,在你的问题的例子加盟前5桌的复合结果将被视为左手表。

有关更多信息,请参见Itzik Ben-Gan's Logical Query Processing Poster

参与的虚拟表的连接可以通过定位ON子句来控制。例如

SELECT * 
FROM T1 
     INNER JOIN T2 
     ON T2.C = T1.C 
     INNER JOIN T3 
        LEFT JOIN T4 
        ON T4.C = T3.C 
     ON T3.C = T2.C 

相当于(T1 Inner Join T2) Inner Join (T3 Left Join T4)

+2

re“可以通过定位ON子句来控制虚拟表格”Cool!所有常见的SQL方言都观察到了吗? –

+2

@PieterGeerkens - 是的,它是ANSI SQL。例如[Postgres小提琴](http://www.sqlfiddle.com/#!1/c3de8/1)和[MySQL小提琴](http://www.sqlfiddle.com/#!8/c3de8/3)。尽管MySQL需要括号。 –

5

这是想在序列JOIN的帮助,所以前者是正确的。

SELECT * 
    FROM a 
    INNER JOIN b ON b.a = a.id 
    INNER JOIN c ON c.b = b.id 
    LEFT JOIN d ON d.c = c.id 
    LEFT JOIN e ON e.d = d.id 

会从abc,所有的ON标准匹配的所有字段,再加上从d其中其标准匹配值加e所有的条件都匹配的所有内容。

我知道RIGHT JOIN是完全可以接受的,但我已经在我的经验中发现,这是不必要的 - 我几乎总是刚刚从左至右加盟的事情。

1

>简单的INNER JOIN VIEW代码...

CREATE VIEW room_view 
AS SELECT a.*,b.* 
FROM j4_booking a INNER JOIN j4_scheduling b 
on a.room_id = b.room_id; 
0

您可以申请加入这样的..

select a.*,b.*,c.*,d.*,e.* 
from [DatabaseName].[Table_a] a 
INNER JOIN [DatabaseName].[Table_b] b ON a.id = b.id 
INNER JOIN [DatabaseName].[Table_c] c ON b.id=c.id 
INNER JOIN [DatabaseName].[Table_d] d on c.id=d.id 
INNER JOIN [DatabaseName].[Table_e] e on d.id=e.id where a.con=5 and 
b.con=6 

这里,在地方的。*和在状态,你可以显示你喜欢的列(提交),并根据条件在哪里条件。您可以根据您的选择插入更多表格和数据库。但是请记住,如果您在不同的数据库中工作,则需要提及数据库名称和别名。