查询以忽略重复/空记录

时间:2016-10-12 23:25:48

标签: sql oracle oracle11g

以下是我们需要加入以获取数据的3个表

 TableA         TableB               TableC
    AId          BId     Name      CId       DeclareDate  value
    1            1       abc       1         September      11
    2            2       def       1         October        12
    3            3       xyz       1         November       13
    4            4       pqr       1         December       14
    5            5       ghi       2         September      15
                                   3         October        16
                                   4         August         17
                                   5         October        18
                                   5         December       19

从TableC我们有相同的基金,CId 1在所有4个月内都宣布,在这种情况下我只需要12月份行,如果基金没有在12月宣布那么我需要得到该C id的零值。 所以输出表应该如下所示。

输出表

   AId    BId  name     DeclareDate   value
    1      1    abc     December      14
    2      2    def     null          null
    3      3    xyz     null          null
    4      4    pqr     null          null
    5      5    ghi     december      19

所以最后如果12月没有声明日期,则返回null,如果有多个声明日期,则返回12月记录。

请建议。

3 个答案:

答案 0 :(得分:2)

使用左连接到表C

  select a.*,b.*, c.DeclareDate, c.Value from TableA a
   inner join TableB b on  a.AI =b.BId
  left join 
  (select * from TableC where DeclareDate='December') c
   on b.BId = c.CId

输出

enter image description here

答案 1 :(得分:0)

如果你的意思是说DeclareDate是一个实际的日期,而你只想要12月的值,那么这样的东西可能有用吗?

select
  a.AId, b.BId, b.Name,
  coalesce (c.CId, A.AId) as CId,
  c.DeclareDate, c.Value
from
  TableA a
  join TableB b on a.AId = b.BId
  left join TableC c on
    a.AId = c.CId and
    extract (month from c.DeclareDate) = 12

这假定了很多 - 特别是如果你在12月有多个日期,他们都会出现。此外,它没有检查年份......任何旧的12月是否足够?

如果你的字面意思是文字字符串" 12月"那么您可以将左连接中的第二个条件更改为c.DeclareDate = 'December'

如果您有更广泛的例子,可能会有助于确定逻辑。

- 编辑 -

以下是一些构建和测试的示例代码:

insert into tablea values (1);
insert into tablea values (2);
insert into tablea values (3);
insert into tablea values (4);
insert into tablea values (5);
insert into tableb values (1, 'abc');
insert into tableb values (2, 'def');
insert into tableb values (3, 'xyz');
insert into tableb values (4, 'pqr');
insert into tableb values (5, 'ghi');
insert into tablec values (1, 'September', 11);
insert into tablec values (1, 'October', 12);
insert into tablec values (1, 'November', 13);
insert into tablec values (1, 'December', 14);
insert into tablec values (2, 'September', 15);
insert into tablec values (3, 'October', 16);
insert into tablec values (4, 'August', 17);
insert into tablec values (5, 'October', 18);
insert into tablec values (5, 'December', 19);

解决方案:

select
  a.AId, b.BId, b.Name,
  coalesce (c.CId, A.AId) as CId,
  c.DeclareDate, c.Value
from
  TableA a
  join TableB b on a.AId = b.BId
  left join TableC c on
    a.AId = c.CId and
    c.DeclareDate = 'December';

结果:

AID BID NAME  CID   DECLAREDATE VALUE
1   1   abc   1     December    14
2   2   def   2     
3   3   xyz   3     
4   4   pqr   4     
5   5   ghi   5     December    19

答案 2 :(得分:0)

试试这个

从TABLEA中选择a.AID,b.DeclareDate,b.VAL左外连接(从TABLEB中选择*,其中DeclareDate ='December')b a.AID = b.BID顺序a.AID asc

< p>