INNER和LEFT OUTER加入帮助

时间:2009-05-20 19:57:37

标签: sql sql-server sql-server-2005

说我有3张桌子。表A,表B,表C

我需要操作INNER JOIN后可用的记录集。

Set 1 -> TableA INNER JOIN TableB
Set 2 -> TableC INNER JOIN TableB

无论Set 2是否为空(LEFT OUTER JOIN),我都需要Set 1。

基本上,我正在尝试编写一个查询并且到目前为止

SELECT *
  FROM TableA 
       INNER JOIN TableB ON ...
       LEFT OUTER JOIN (TableC INNER JOIN TableB)

我将如何在SQL Server中编写?

编辑:实际上,我要做的是加入多个表格。如果我需要连接多个表,你的响应会如何变化ex:OUTER JOIN OF(TableA和TableB的内部联接)和(TableC和TableD的内部联接)注意:等式中有一个新的TableD

9 个答案:

答案 0 :(得分:4)

 SELECT * FROM TableA 
       INNER JOIN TableB ON TableB.id = TableA.id
       LEFT JOIN TABLEC ON TABLEC.id = TABLEB.id

我不知道您尝试使用哪些列,但它只是那么简单

编辑: 看看你的编辑,似乎你对Joins实际做的事情感到困惑。在上面写的示例中,您将收到以下结果。

列 - >您将获得TableA,TableB和TableC的所有列

Rows->您将从tableA的所有行开始。接下来,您将从TableA中删除表B中没有匹配“id”的所有行。(如果TableA和TableB之间不是1:1的关系,则会有重复项)。

现在,如果您从上面获取结果,您将匹配TableC中与TableB.id列匹配的任何记录。上面没有匹配的TableC记录的任何行将在结果中获得TableC中所有列的空值。

建议 - 我打赌,只有部分内容对您有意义,但我的建议是您开始编写一些查询,预测结果,然后查看您的预测是否正确,看看您是否理解它在做什么。 / p>

答案 1 :(得分:2)

你想要的不是JOIN而是UNION。

SELECT * FROM TableA INNER JOIN TableB ON ...
UNION
SELECT * FROM TableC INNER JOIN TableD ON ...

答案 2 :(得分:2)

您实际上可以在连接中添加一个排序,就像在数学方程中那样:(5 + 4)*(3 + 1)。

鉴于问题的第二部分,请尝试一下:

SELECT
     <your columns>
FROM
     (TableA INNER JOIN Table B ON <join criteria for A to B>)
LEFT OUTER JOIN
     (TableC INNER JOIN Table D ON <join criteria for C to D>) ON
     <join criteria for AxB to CxD>

答案 3 :(得分:1)

Select * from ((((TableA a inner join TableB b on a.id = b.id) 
                left outer join TableC c on b.id = c.id)
                full outer join TableD d on c.id = d.id)
                right outer join TableE e on e.id = d.id)
                /* etc, etc... */

如果需要,您可以丢失括号。

答案 4 :(得分:0)

试试这个..

SELECT *
  FROM TableA              a 
       INNER JOIN TableB   b ON a.id=b.id
       LEFT OUTER JOIN (SELECT *
                            FROM TableC            c
                                INNER JOIN TableD  d on c.id=d.id
                       ) dt on b.id=dt.id

答案 5 :(得分:0)

SELECT *
  FROM TableA A
 INNER JOIN TableB B  ON B.?? = A.??  AND ...
  LEFT JOIN TableC C  ON C.?? = B.??  AND ...
  LEFT JOIN TableB B2 ON B2.?? = C.?? AND ...
  LEFT JOIN TableD D  ON D.?? = C.??  AND ...

所以这就是事情:逻辑上,连接实际上并不在特定的表之间,它们位于表和“set”(连接和表)的其余部分之间。因此,当 知道C和B2之间或C和D之间存在一对一的关系时,你不能INNER JOIN到C,因为C可能是null从它的LEFT JOIN到B,这将消除这些行,有效地撤消你的LEFT连接。

基本上,对于LEFT外连接的表的任何连接也必须是LEFT外连接。这有意义吗?

答案 6 :(得分:0)

假设我理解你的问题,我认为这就是你所要求的:

SELECT * 
FROM TableA INNER JOIN TableB on TableA.JoinColumn = TableB.JoinColumn
LEFT OUTER JOIN TableC on TableB.JoinColum = TableC.JoinColumn
INNER JOIN TableD on TableC.JoinColumn = TableD.JoinColumn

请注意,JoinColumn用于加入A&amp; B不必与用于加入B&amp; B的那个列相同。 C等等C&amp; d。

答案 7 :(得分:0)

您没有给出连接条件或解释表格是如何相关的,因此如何简化这一点并不明显。

SELECT a.a_id, b1.b_id b1_id, b2_id, bc.c_id
FROM TableA a JOIN TableB b1 on a.b_id = b1.b_id
LEFT JOIN (SELECT c.c_id, b2.b_id b2_id
    FROM TableC c JOIN TableB b2 ON c.b_id = b2.b_id
  ) bc ON bc.c_id = a.c_id;

查看最新的编辑内容,您可以执行以下操作:

SELECT <columns>
FROM (SELECT <columns> FROM TableA JOIN TableB ON <A-B join conditions>)
           LEFT JOIN
           (SELECT <columns> FROM TableC JOIN TableD ON <C-D join conditions>)
           ON <AB-CD join conditions>

虽然你实际上并不需要内部投影,但可以这样做:

SELECT <columns>
FROM (TableA a JOIN TableB b ON <A-B join conditions>)
           LEFT JOIN
           (TableC c JOIN TableD d ON <C-D join conditions>)
           ON <AB-CD join conditions>

AB-CD连接条件是直接用a,b,c,d等列写的。

答案 8 :(得分:0)

由于您使用的是Sql Server,为什么不创建可以帮助您的视图?在巨大的Sql语句中填充所有内容可能会变得难以阅读。示例视图可能如下所示:

create view AandB
as
select *
from A
inner join B on B.aid = A.aid

同样对于CandD。然后,您可以使用简单的Sql检索可选连接:

select *
from AndB
left outer join CandD on AndB.cid = CandD.cid

如果您对两个集合中的行感兴趣,可以进行完全加入:

select *
from AndB
full outer join CandD on AndB.cid = CandD.cid