Oracle查询加入两个表

时间:2018-05-09 03:54:47

标签: sql oracle

我有一个包含以下字段的主列表

表A

  1. columnname(在事务表值中用作列名,如A,B,C)
  2. 项目编号(用作该栏的值,A1,A2,A3,B1,B2,B3,C1,C2)
  3. item_description用于在屏幕上显示
  4. 表B

    1. Id
    2. A(表A中的名称,将item_no存储为值)
    3. B
    4. C
    5. 现在我必须从表A中获取Itemdescription以获得表B中的对应值。

4 个答案:

答案 0 :(得分:0)

您可以使用简单的JOIN:

editor.putBoolean("Alert_Dialog", false).commit()

答案 1 :(得分:0)

不幸的是,您对样本数据进行了过度混淆,这使得难以理解用例,但我认为您在表A中混合了元数据和实际数据。哪个太可怕了。我确信这个设计的创始人有理由,但结果总是可怕的查询。

这是一个解决方案,可以说比替代方案更糟糕。

select b.id
       , t_a.Itemdescription as a_Itemdescription
       , t_b.Itemdescription as b_Itemdescription
       , t_c.Itemdescription as c_Itemdescription
from b
     left outer join 
          ( select a.itemdescription
                   , a.item_no
            from a
            where a.columnname = 'A') t_a
           on t_a.item_no b.a
     left outer join 
          ( select a.itemdescription
                   , a.item_no
            from a
            where a.columnname = 'B') t_b
           on t_b.item_no b.b
     left outer join 
          ( select a.itemdescription
                   , a.item_no
            from a
            where a.columnname = 'C') t_c
           on t_c.item_no b.c

说实话,我不确定这是你正在寻找的答案。如果不是编辑您的问题以澄清要求。最好将样本数据作为表中的行提供,并发布从输入派生的示例输出。

答案 2 :(得分:0)

我相信你想要:

select a.*, b.description
from a join
     b
     on (a.columnname = 'A' and a.itemno = b.A) or
        (a.columnname = 'B' and a.itemno = b.B) or
        (a.columnname = 'C' and a.itemno = b.C);

在Oracle中,您可以将其缩短为:

select . . .
from a join
     b
     on (a.columnname, a.itemno) in ( ('A', A), ('B', B), ('C', C));

这可能不是特别有效。所以更有效的方法是:

select a.*, coalesce(ba.description, bb.description, bc.description)
from a left join
     b ba
     on a.columnname = 'A' and a.itemno = ba.A left join
     b bb
     on a.columnname = 'B' and a.itemno = bb.B left join
     b bc
     on a.columnname = 'C' and a.itemno = bc.C;

答案 3 :(得分:0)

使用左联接来完成查询