Sql 在Oracle数据库中创建视图
我想在Oracle中创建一个视图,该视图根据以下条件获取数据: 第一种情况:在表1中,对于相同的CALLTICKET&ORDERNO,有5个部分被请求。 已收到前四个,并要求删除其中一个设置DEL_FLG“D”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
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的问题来看,他似乎对这些内容不感兴趣。所以:你可以问一个问题来澄清;或者现在就开枪,以后再问问题。或者永远不会。不好的!谁有时间提问-对吗?