我需要澄清多个连接在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的所有记录都丢失了。
答案 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