在SQL中连接多个表

时间:2013-04-13 11:33:00

标签: sql sql-server join

sombody可以解释一下加入吗?

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

左外连接从左侧选择所有数据而不管是否共同,但是从右表中获取公共数据,反之亦然。

我知道基础知识,但在加入5,8,10个表时问题仍然存在。

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

我的意思是说现在前5个表的结果集将作为左表,第6个表将被视为右表?或者只有第五个表被视为左表,第六表被视为右表?请帮我解决这个问题。

5 个答案:

答案 0 :(得分:20)

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

因此,在你的问题的例子中,加入前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)

答案 1 :(得分:8)

按顺序考虑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

来自ab以及c的所有ON条件匹配的所有字段,以及来自d且其条件匹配的值加上e所有标准匹配的所有内容。

我知道RIGHT JOIN是完全可以接受的,但我根据自己的经验发现这是不必要的 - 我几乎总是从左到右加入。

答案 2 :(得分:1)

<强>&GT;简单的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;

答案 3 :(得分: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

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

答案 4 :(得分:0)

刚刚从 W3School 中给出的示例数据库中尝试了以下内容。对我来说效果很好。

boost::hana::transform