在Oracle数据库中创建View

时间:2017-02-22 12:17:37

标签: sql oracle

我想在Oracle中创建一个View,它根据以下条件获取数据:

情况第一:在TABLE1中,相同的CALLTICKET& ORDERNO有5个部分要求。 收到前四个,并要求删除一个DEL_FLG' D'。

    TABLE1
    ------------------------------------------------------
    CALLTICKET ORDERNO  PART_NO   RECEIVE_ETA   DEL_FLG
    123456     100900   ABC-123   09-02-2017       N
    123456     100900   ABC-121   09-02-2017       N      
    123456     100900   ABC-456   09-02-2017       N
    123456     100900   ABC-697   09-02-2017       N
    123456     100900   ABC-852                    D

情境第二:在TABLE1中,相同的CALLTICKET& ORDERNO有5个部分要求。 收到了两个部分,其中两个正在等待交付,还有一个要求删除,这些部分设置了DEL_FLG' D'。

    TABLE1
    ------------------------------------------------------
    CALLTICKET ORDERNO  PART_NO   RECEIVE_ETA   DEL_FLG
    123456     100900   ABC-123   09-02-2017       N
    123456     100900   ABC-121   09-02-2017       N      
    123456     100900   ABC-456                    D
    123456     100900   ABC-697                    N
    123456     100900   ABC-852                    N

现在我想创建一个VIEW,它选择 那些其DEL_FLG为' D'的DISTINCT CALLTICKET。 其他部分已交付,即RECEIVE_ETA不是NULL(与情况优先类似),而不像已有一个已删除PART_NO的情况第二,但仍有两个部分的交付尚待处理。

请帮我创建指定条件的VIEW或SELECT查询。 谢谢!

4 个答案:

答案 0 :(得分:0)

如果您只需要calltickets,则可以使用聚合:

select calltickets, orderno
from table1
group by calltickets, orderno
having sum(case when receive_eta is null and del_flag = 'N' then 1 else 0 end) = 0 and
       sum(case when del_flag = 'Y' then 1 else 0 end) > 0;

第二个条件是因为您似乎需要至少有一个已删除行的calltickets / orders。

答案 1 :(得分:0)

此查询将返回与第一种情况的条件匹配的记录,并排除与第二种情况的条件匹配的记录:

select distinct callticket
       , orderno
from table1
where del_flg = 'D'
and (callticket, orderno) not in 
          ( select callticket, orderno
            from table1
            where del_flg != 'D'
            and receive_eta is null )

根据所涉及的记录数量,这可能效率不高。然而,真正需要的是更好的数据模型。

答案 2 :(得分:0)

您可以使用NOT EXISTS。

此查询返回del_flg ='D'且所有RECEIVE_EXTA都不为空的所有行

select * from table1 t1 where DEL_FLG = 'D'
and not exists (select 1 from table1 t2 where (t2.callticket=t1.callticket and t2.RECEIVE_EXTA IS NULL );

但是del_flg ='D'可能有多条记录。在这种情况下你需要什么?如果您只需要callticket,您可以使用

select distinct callticket from table1 t1 where DEL_FLG = 'D'
and not exists (select 1 from table1 t2 where (t2.callticket=t1.callticket and t2.RECEIVE_EXTA IS NULL );

如果您知道,因为看起来ORDERNO对于callticket来说是独一无二的,您也可以将它放在字段列表中。

但根据您的需要,查询可能会变得更清晰

答案 3 :(得分:0)

  1. 内部查询 - 检查DEL_FLG ='N'并接收的记录(RECEIVE_ETA为空)。这里我使用min函数和group by函数。它将选择最小接收日期。如果为null,则NVL功能将分配接收日期'1900-01-01'。如果至少有一个记录具有空值,它将返回'1900-01-01'。
  2. 外部查询 - 在上述查询的帮助下,使用DEL_FLG ='D'获取所有记录并收到所有记录

    SELECT DISTINCT A.CALLTICKET 从TABLE1 A,   (选择CALLTICKET,     MIN(NVL(RECEIVE_ETA,'1900-01-01'))RECEIVE_ETA   FROM TABLE1   WHERE DEL_FLG ='N'   GROUP BY CALLTICKET   )B A.CALLTICKET = B.CALLTICKET AND A.DEL_FLG ='D' AND B.RECEIVE_ETA<> '1900-01-01'

  3. 如果您需要更多帮助,请告诉我。