说我有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
答案 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 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。
答案 6 :(得分: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等列写的。
答案 7 :(得分: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
答案 8 :(得分: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外连接。这有意义吗?