Sql oracle连接表

Sql oracle连接表,sql,oracle,join,Sql,Oracle,Join,嗨,朋友们,我在连接oracle中的两个表时遇到问题。我的两个表如下所示 表1看起来像 id Name Jan 7001 Deven 22 7002 Clause 55 7004 Monish 11 7010 Dipesh 55 7070 Dipika 100 id Name Feb 7001 Deven 12 7002 Clause 15 7003 Nim

嗨,朋友们,我在连接oracle中的两个表时遇到问题。我的两个表如下所示

表1看起来像

 id    Name    Jan  
 7001  Deven   22 
 7002  Clause  55 
 7004  Monish  11 
 7010  Dipesh  55
 7070  Dipika  100
  id      Name       Feb  
  7001    Deven      12 
  7002    Clause     15 
  7003    Nimesh     20 
  7004    Monish     21 
  7005    Ritesh     22 
  id      Name      Jan   Feb  
  7001    Deven     22    12 
  7002    Clause    55    15 
  7003    Nimesh    -     20 
  7004    Monish    11    21 
  7005    Ritesh    -     22 
  7010    Dipesh    55    -
  7070    Dipika    100   -
表2看起来像

 id    Name    Jan  
 7001  Deven   22 
 7002  Clause  55 
 7004  Monish  11 
 7010  Dipesh  55
 7070  Dipika  100
  id      Name       Feb  
  7001    Deven      12 
  7002    Clause     15 
  7003    Nimesh     20 
  7004    Monish     21 
  7005    Ritesh     22 
  id      Name      Jan   Feb  
  7001    Deven     22    12 
  7002    Clause    55    15 
  7003    Nimesh    -     20 
  7004    Monish    11    21 
  7005    Ritesh    -     22 
  7010    Dipesh    55    -
  7070    Dipika    100   -
我想把这两张表结合起来,然后像下面这样回答

表2看起来像

 id    Name    Jan  
 7001  Deven   22 
 7002  Clause  55 
 7004  Monish  11 
 7010  Dipesh  55
 7070  Dipika  100
  id      Name       Feb  
  7001    Deven      12 
  7002    Clause     15 
  7003    Nimesh     20 
  7004    Monish     21 
  7005    Ritesh     22 
  id      Name      Jan   Feb  
  7001    Deven     22    12 
  7002    Clause    55    15 
  7003    Nimesh    -     20 
  7004    Monish    11    21 
  7005    Ritesh    -     22 
  7010    Dipesh    55    -
  7070    Dipika    100   -

根据问题中给出的样本数据,我认为您有一些记录只存在于表1或表2中。因此,
内部联接
不适用。请使用
完全外部联接
,如下所示:

SELECT NVL(table1.id,table2.id), NVL2(table1.id,table1.name,table2.name), table1.jan, table2.feb 
FROM  table1
FULL OUTER JOIN table2 ON table1.id = table2.id

有关SQL联接的更多信息,请参考

根据问题中给出的示例数据,我认为有些记录只存在于表1或表2中。因此,
内部联接
不适用。请使用
完全外部联接
,如下所示:

SELECT NVL(table1.id,table2.id), NVL2(table1.id,table1.name,table2.name), table1.jan, table2.feb 
FROM  table1
FULL OUTER JOIN table2 ON table1.id = table2.id

有关SQL联接的更多信息,请参阅使用外部联接语法联接非对称记录集。左连接将提供所需的结果:

SQL> select t72.id
  2         , t72.name
  3         , t34.jan
  4         , t72.feb
  5  from t72
  6       left outer join t34
  7       on ( t72.id = t34.id)
  8  order by t72.id
  9  /

        ID NAME                        JAN        FEB
---------- -------------------- ---------- ----------
      7001 Deven                        22         12
      7002 Clause                       55         15
      7003 Nimesh                                  20
      7004 Monish                       11         21
      7005 Ritesh                                  22

SQL>
编辑

我注意到,在我进行演示时,您已经修改了示例数据

当两个表都有ID值,而另一个表缺少ID值时,我们可以使用完全联接从两侧检索值:

SQL> select nvl(t72.id, t34.id) as id
  2         , nvl(t72.name, t34.name) as name
  3         , t34.jan
  4         , t72.feb
  5  from t72
  6       full outer join t34
  7       on ( t72.id = t34.id)
  8  order by t72.id
  9  /

        ID NAME                        JAN        FEB
---------- -------------------- ---------- ----------
      7001 Deven                        22         12
      7002 Clause                       55         15
      7003 Nimesh                                  20
      7004 Monish                       11         21
      7005 Ritesh                                  22
      7010 Dipesh                       55
      7070 Dipika                      100

7 rows selected.

SQL>

我们使用外部连接语法连接非对称记录集。左连接将提供所需的结果:

SQL> select t72.id
  2         , t72.name
  3         , t34.jan
  4         , t72.feb
  5  from t72
  6       left outer join t34
  7       on ( t72.id = t34.id)
  8  order by t72.id
  9  /

        ID NAME                        JAN        FEB
---------- -------------------- ---------- ----------
      7001 Deven                        22         12
      7002 Clause                       55         15
      7003 Nimesh                                  20
      7004 Monish                       11         21
      7005 Ritesh                                  22

SQL>
编辑

我注意到,在我进行演示时,您已经修改了示例数据

当两个表都有ID值,而另一个表缺少ID值时,我们可以使用完全联接从两侧检索值:

SQL> select nvl(t72.id, t34.id) as id
  2         , nvl(t72.name, t34.name) as name
  3         , t34.jan
  4         , t72.feb
  5  from t72
  6       full outer join t34
  7       on ( t72.id = t34.id)
  8  order by t72.id
  9  /

        ID NAME                        JAN        FEB
---------- -------------------- ---------- ----------
      7001 Deven                        22         12
      7002 Clause                       55         15
      7003 Nimesh                                  20
      7004 Monish                       11         21
      7005 Ritesh                                  22
      7010 Dipesh                       55
      7070 Dipika                      100

7 rows selected.

SQL>

Hai friend感谢您的帮助,但是当我有两个以上的专栏,如“Jan,Fab,Mar,Apr…,…,Dec”到12月时,我该怎么办?那么我该如何解决这样的问题?@Deven-理想的解决方案是给自己找一个不那么糟糕的模式设计!但我知道这是怎么回事,我们必须与我们所给予的合作:(没有什么可以阻止您在12个表上使用完整的外部联接。但是,如果您的表有许多行,性能可能会受到影响,因为Optimizer可能会对所有行进行完整的表扫描。Hai friend感谢您的帮助,但是当我有两个以上的列,例如“Jan,Fab,Mar,Apr…,,,,,,,Dec”时,我该怎么办在12月之前,我该如何解决这样的问题?@Deven-理想的解决方案是为自己设计一个不那么糟糕的模式设计!但我知道这是怎么回事,我们必须按照我们给出的:(没有什么可以阻止您在12个表上使用完整的外部联接。但是,如果您的表有许多行,性能可能会受到影响,因为Optimizer可能会在所有行上进行完整的表扫描。