Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在多个列上联接多个表_Sql_Oracle - Fatal编程技术网

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呢?它还能用吗?