SQL LEFT OUTER JOIN 在 3 个表上,中间有一个连接表

问题描述 投票:0回答:2

我有3张桌子:

  • 输入_输出

我想要 IN 中的所有项目,如果它们存在于 IN_OUT 和 OUT 中,则需要 OUT 中的值。

我写道:

SELECT intable.colA, outtable.colB 
from IN intable 
LEFT OUTER JOIN IN_OUT inouttable ON inouttable.idin = intable.idin 
LEFT OUTER JOIN OUT outtable ON inouttable.idout = outtable.idout

这给了我一个例子:

  • 使用 outtable 中的值得出 2 个正确结果(IN“对象”在 INOUT 中出现两次,相应的值出现在 OUT 中)
  • 但是又不知从何而来的 1 条结果行,outtable 列为空值!

我尝试了这个解决方案:相同的结果。

 SELECT intable.colA, outtable.colB 
 FROM IN intable 
 LEFT OUTER JOIN (SELECT inouttable.idin, outtable.colB FROM IN_OUT inouttable, OUT outtable WHERE inouttable.idout = outtable.idout) out2
 ON in.idin = out2.idin 

我该如何编写才能使其正常工作?

为了说明,我有:

IN TABLE
IDIN      COLA
1         ABC
2         DEF

OUT TABLE
IDOUT      COLA
1          XYZ
2          XYZ2

INOUT TABLE
IDIN    ID OUT
1       1
1       2

我想要这样的结果:

COLA      COLB
ABC       XYZ
ABC       XYZ2
DEF       null

但目前,我只成功了:

COLA      COLB
ABC       XYZ
ABC       XYZ2
ABC       null
DEF       null
sql join left-join
2个回答
2
投票

使用两个左[外部]连接:

SELECT 
   IN.COLA as ColA,
   OUT.COLA as ColB
FROM `IN`
LEFT JOIN IN_OUT ON IN.IDIN = IN_OUT.IDIN
LEFT JOIN `OUT` ON OUT.IDOUT = IN_OUT.IDOUT
ORDER BY IN.COLA, OUT.COLA

参见:DBFIDDLE

输出:

ColA ColB
ABC XYZ
ABC XYZ2
防御

P.S.:建议不要使用保留字作为表名....


0
投票

我几个小时面临的这个问题是由于...(非常)制作不良的 ID... 如果您遇到同样的问题,请仔细检查您的 ID。

© www.soinside.com 2019 - 2024. All rights reserved.