Sql 在多个列上联接多个表
一、 另外,我还有一个关于如何连接数据库表的问题。我的数据设置如下:Sql 在多个列上联接多个表,sql,oracle,Sql,Oracle,一、 另外,我还有一个关于如何连接数据库表的问题。我的数据设置如下: MainTable main_id x y z 1 l m n 2 o p q SubTableA main_id extra_id foo bar 1 a 1 4 1 b 2 h 1 c 1 g 2 a k er 2 b k 34 2 c
MainTable
main_id x y z
1 l m n
2 o p q
SubTableA
main_id extra_id foo bar
1 a 1 4
1 b 2 h
1 c 1 g
2 a k er
2 b k 34
2 c l f
SubTableB
main_id extra_id a b c
1 a v r j
1 c w r k
2 c x h l
SubTableC
main_id extra_id mono stereo
2 c n null
2 d z y
我正在努力实现以下结果:
main_id x y z extra_id foo bar a b c mono stereo
1 l m n a 1 4 v r j null null
1 l m n b 2 h null null
1 l m n c 1 g w r k null null
2 o p q a k er null null
2 o p q b k 34 null null
2 o p q c l f x h l n null
2 o p q d z y
为了增加趣味性,有时extra\u id
为空,或者其中一个子表不包含main\u id
,但我希望其他表被联接,并为找不到的值填充空值。在这种情况下,我希望结果是:
main_id x y z extra_id foo bar a b c null null
例如
SELECT
m.main_id,
m.x,
m.y,
m.z,
a.extra_id,
a.foo,
a.bar,
b.a,
b.b,
b.c,
c.mono,
c.stereo
FROM MainTable m
LEFT JOIN SubTableA a
ON m.main_id = a.main_id
LEFT JOIN SubTableB b
ON a.main_id = b.main_id AND a.extra_id = b.extra_id
LEFT JOIN SubTableC c
ON a.main_id = b.main_id AND a.extra_id = c.extra_id
我试图使用它作为模板,但始终无法获得它
这就是我迄今为止所尝试的:
SELECT
m.*,
a.*,
b.*,
c.*,
FROM
MainTable m,
SubTableA a,
SubTableB b,
SubTableC c,
WHERE
m.main_id = a.main_id(+)
AND a.main_id=b.main_id(+)
AND a.extra_id=b.extra_id(+)
AND a.main_id = c.main_id(+)
AND a.extra_id = c.extra_id(+);
编辑:我要主表中的所有行。当它们匹配main_id上的子表时,为每个额外的_id(每个main_id可以有多个)连接它们。如果在多个子表中存在main_id和extra_id的组合,我希望将它们连接起来。当再次面对笔记本电脑时,将给出更详细的示例 谢谢,
Christian让我们看看你的加入。您想将Main连接到,但保留A中存在的所有行,但没有Main_id,对吗?所以你想要从连接的右边开始
MainTable M RIGHT JOIN SubTableA A ON M.main_id = A.main_id
而你想这样做,将所有的表
SELECT
A.*
, B.*
, C.*
FROM
MainTable M
RIGHT JOIN SubTableA A ON M.main_id = A.main_id
RIGHT JOIN SubTableB B ON M.main_id = B.main_id
RIGHT JOIN SubTableC C ON M.main_id = C.main_id
WHERE
[some stuff]
注意:您可能需要尝试右外部联接。
注2:我被描述搞糊涂了。如果行存在于Main中,但不在子表中,那么您需要在Main中保留所有行,而不管它们是否存在于联接的另一侧。如果该行存在于子表中,但不在主表中,则需要右外部
另外,我没有意识到这是针对Oracle的,所以我希望它没有太大的不同。这个答案假设您想要左连接,而不是右连接-换句话说,始终显示
MainTable
中的行,即使子表a
和其他表中没有相关行。这是由mono
和stereo
的带有空值的样本输出所暗示的
我想使用较新的联接语法,如果您想要包含一个列,您应该命名它,而不是依赖于SELECT*
SELECT*
对于快速的特殊查询很好,但是对于更多的查询,您应该命名列
我还建议使用别名来减少打字。考虑到示例中的SC
和AD
,您似乎正在这样做
SELECT
m.main_id,
m.x,
m.y,
m.z,
a.extra_id,
a.foo,
a.bar,
b.a,
b.b,
b.c,
c.mono,
c.stereo
FROM MainTable m
LEFT JOIN SubTableA a
ON m.main_id = a.main_id
LEFT JOIN SubTableB b
ON a.main_id = b.main_id AND a.extra_id = b.extra_id
LEFT JOIN SubTableC c
ON a.main_id = b.main_id AND a.extra_id = c.extra_id
但是如果Subtable B包含一个不在Subtable a中的主id呢?它还能用吗?