了解SQL Server多表连接

时间:2018-02-05 18:07:02

标签: sql-server join

我需要澄清多个连接在SQL Server中的工作方式。

我有4个表,比如表A,表B,表C,表D.所有表都是相互关联的(A-B-C-D)。

表A和B组成一组(发票),表B和C另一组(订单)

表A有100条记录,B有90条,C有60条,D有70条。

A和B之间的关系是一对多的关系。 A- = B,并且我想单独加入它们(因为它们是发票的一部分)

D是与C具有一对多关系的内部连接。 C = -D并且我想单独加入它们(因为它们是订单的一部分)

B和C之间的关系是一对一的,我想要加入它们。即B和Null中缺少C记录的所有记录。同时,加入所有表格。所以,我想要总共90条记录(全部来自表B和Null,它们不存在)

A-=B--C=-D

我的理解是我可以使用以下代码。

SELECT * 
FROM Table A AS A
INNER JOIN Table B AS B ON A.id = B.id
LEFT JOIN Table C AS C ON B.Cid = C.Cid AND B.key = C.key
INNER JOIN Table D AS D ON C.Did = D.Did

然而,这似乎产生了错误的结果。我有70条记录。保持C和D之间的连接,即查询中的最后一个连接,左连接我得到了100条记录。

SELECT * 
FROM Table A AS A
INNER JOIN Table B AS B ON A.id = B.id
LEFT JOIN Table C AS C ON B.Cid = C.Cid AND B.key = C.key
LEFT JOIN Table D AS D ON C.Did = D.Did

为什么会发生这种情况以及获取90条记录的正确方法是什么,即表B和Null的所有记录都丢失了。

3 个答案:

答案 0 :(得分:1)

您必须在子查询中进行C和D之间的连接,然后将其连接到B.这样的事情:

SELECT * 
FROM Table A AS A
INNER JOIN Table B AS B ON A.id = B.id
LEFT JOIN ( 
    SELECT C.Cid, C.key
    FROM Table C AS C
    JOIN Table D AS D ON C.Did = D.Did ) AS CD ON B.Cid = CD.Cid AND B.key = CD.key

在SQL中没有括号(或嵌套)语法的情况下,你不能让equijoin离开join然后equijoin跨越关系。

答案 1 :(得分:0)

尝试这样的事情,似乎表B是你的基表,而不是表A

SELECT * 
FROM Table B AS B
INNER JOIN Table A AS A ON B.id = A.id
LEFT JOIN ( 
SELECT C.Cid, C.key
FROM Table C AS C
INNER JOIN Table D AS D ON C.Did = D.Did ) AS CD ON B.Cid = CD.Cid AND B.key = CD.key

答案 2 :(得分:0)

你可能正在寻找这个

SELECT * 
  FROM Table A AS A
 INNER JOIN Table B AS B 
         ON A.id = B.id
 LEFT  JOIN Table C AS C 
       INNER JOIN Table D AS D 
               ON C.Did = D.Did 
         ON B.Cid = C.Cid 
        AND B.key = C.key