【问题标题】:joining table of oracleoracle的连接表
【发布时间】:2010-05-31 08:28:52
【问题描述】:

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

table1 看起来像

 id    Name    Jan  
 7001  Deven   22 
 7002  Clause  55 
 7004  Monish  11 
 7010  Dipesh  55
 7070  Dipika  100

table2 看起来像

  id      Name       Feb  
  7001    Deven      12 
  7002    Clause     15 
  7003    Nimesh     20 
  7004    Monish     21 
  7005    Ritesh     22 

我想把这两张表结合起来,想像下面这样回答

table2 看起来像

  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   -

【问题讨论】:

    标签: sql oracle join


    【解决方案1】:

    我们使用 OUTER JOIN 语法连接非对称记录集。 LEFT JOIN 将提供您想要的结果:

    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 值时,我们可以使用 FULL JOIN 从两边检索值:

    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 朋友感谢您的帮助,但是当我在 12 月之前有两列以上类型的“Jan,Fab,Mar,Apr...,...,Dec”时我该怎么办那么我该如何解决这样的问题呢?
    • @Deven - 理想的解决方案是让自己获得一个不是 Teh Suck 的架构设计!但我知道它是怎么回事,我们必须使用我们给定的东西:(没有什么可以阻止你在 12 个表上使用 FULL OUTER JOIN。但是,如果你的表有很多行,性能可能会受到影响,因为优化器很可能对所有这些都进行全表扫描。
    【解决方案2】:

    根据问题中给出的示例数据,我认为您有一些记录只存在于 table1 或 table2 中。所以inner join 不适用。请按如下方式使用full outer join,

    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 连接的更多信息,请参阅 Wikipedia article

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-13
      • 2011-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-18
      相关资源
      最近更新 更多