我想在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查询。 谢谢!
答案 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)
外部查询 - 在上述查询的帮助下,使用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'
如果您需要更多帮助,请告诉我。