Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在Oracle数据库中创建视图_Sql_Oracle - Fatal编程技术网

Sql 在Oracle数据库中创建视图

Sql 在Oracle数据库中创建视图,sql,oracle,Sql,Oracle,我想在Oracle中创建一个视图,该视图根据以下条件获取数据: 第一种情况:在表1中,对于相同的CALLTICKET&ORDERNO,有5个部分被请求。 已收到前四个,并要求删除其中一个设置DEL_FLG“D” TABLE1 ------------------------------------------------------ CALLTICKET ORDERNO PART_NO RECEIVE_ETA DEL_FLG 123456 100

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

第一种情况:在表1中,对于相同的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  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
第二种情况:在表1中,对于相同的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  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
现在我想创建一个视图,该视图只选择DEL_FLG为“D”但其余部分已交付的不同的CallTicket,即,RECEIVE_ETA与第一种情况不同,与第二种情况不同,第二种情况有一个已删除的部分,但两个部分的交付仍在等待中

请帮助我为指定条件创建视图或选择查询。 谢谢

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

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至少有一行已删除。

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

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 )

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

您可以使用的数据模型不存在

此查询返回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'可能不止一个记录。这种情况下你需要什么?如果你需要电话票,你可以用它

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是唯一的,所以您也可以将它放在字段列表中

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

内部查询-检查DEL_FLG='N'且receivedRECEIVE_ETA为空的记录。这里我使用min函数和groupby函数。它将选择最小接收日期。如果为空,NVL函数将分配接收日期“1900-01-01”。如果至少一条记录有空值,它将返回“1900-01-01”。 外部查询-借助上述查询获取DEL_FLG='D'的所有记录,并接收所有记录

选择不同的A.CALLTICKET 从表1 A中, 选择CALLTICKET, MINNVLRECEIVE_ETA,'1900-01-01'RECEIVE_ETA 来自表1 其中DEL_FLG='N' 团体电话票 B 其中A.CALLTICKET=B.CALLTICKET 和A.DEL_FLG='D' 和B.接收“1900-01-01”


如果您在这方面需要更多帮助,请告诉我。

为什么您认为您需要存储过程?@a_horse_,没有名字-我想他不需要;我将编辑PL。如果您为示例数据添加所需的结果,这将有所帮助。好的,我想我理解这个要求。D和N是否是DEL_FLG中唯一可能的值和/或是否可以为空?另外,您是否需要所有五个部件都已交付且没有DEL_FLG=D行的车票?而且-总是五个部分,或者CALLTICKET和ODERNO的一些组合可以有不同数量的部分吗?在一个CALLTICKET上可以有不同数量的部分请求,这只是一个有五个部分的示例。默认情况下,DEL_标志设置为“N”。所以这里只有“N”和“D”起作用。我的要求是只取里面有“D”的电话票,但其余的部分已经交付。情况二中有“D”,但有两个部分仍有待交付,因此不应在视图中获取。这也将返回没有DEL_FLG=D行的calltickets。从OP的问题来看,他似乎对这些内容不感兴趣。所以:你可以问一个问题来澄清;或者现在就开枪,以后再问问题。或者永远不会。不好的!谁有时间提问-对吗?