2009-05-20 48 views
1

说我有3张桌子。表A,表B,表CINNER和LEFT OUTER加入帮助

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

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

我需要设置1,不论是否设置2为空(LEFT OUTER JOIN)想到的。

所以基本上,我试图写一个查询,并已走到这一步

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

我怎么会在SQL Server写?

编辑:在现实中,我想要做的是加入多个表。如何将你的反应变化,如果我需要连接多个表EX:外(内JOIN表A和表B)和(INNER JOIN表C和表D的)注意JOIN:有一个新提交的方程中

+1

re:你的编辑,这个问题可能更容易回答,如果它更具体。用于连接所有表的值相同一个CustomerID?或者你的内部联接只是为了获得查找值,例如TableB包含TableA中CategoryCode字段的CategoryDe​​scription? – Matt 2009-05-20 20:12:47

回答

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... */ 

如果需要,可以丢掉括号。

+0

表C应该是链接到表B,不表A – 2009-05-20 20:02:41

+1

C被链接到的结果(A内部连接B) – 2009-05-20 20:04:19

+0

我需要一个INNER C和D之间的连接是否您的查询做一个内部联接?从本质上讲,我需要的是(A INNER B)LEFT OUTER(C INNER d) – 2009-05-20 20:10:34

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

我不知道你要使用哪些列,但它是这么简单

编辑: 看你的编辑看来你是无所适从加盟怎么做。在上面我写的例子中,您将会收到以下结果。

列 - >您将获得的所有列的表A,表B和表C

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

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

建议 - 我敢打赌,这只对你有意义,但我的建议是,你开始写一些查询,预测结果,然后看看你的预测是否正确,看看你是否明白它在做什么。

+0

请参阅编辑对提交方案 – 2009-05-20 20:04:06

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 
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用于接合&乙没有按必须与用于加入B & C的列相同,以此类推C & D.

2

你想要什么不是一个JOIN,而是一个UNION。

SELECT * FROM TableA INNER JOIN TableB ON ... 
UNION 
SELECT * FROM TableC INNER JOIN TableD ON ... 
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等列写成。

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> 
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 
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 ... 

所以这里的东西:逻辑上,连接实际上并不在特定的表之间,它们位于表和“连接”(表和连接)的其余部分之间。所以虽然知道C和B2之间或C和D之间存在一对一的关系,所以你不能INNER JOIN到C,因为C可能是空的,它是LEFT JOIN到B,它会消除这些行,有效地撤销你的左连接。

因此,基本上,任何连接到左外连接的表的连接也必须是左外连接。这有意义吗?