从表中检索SQL

时间:2019-03-13 03:44:06

标签: sql oracle

Sales

ItemID  Date               Code
-------------------------------------------------
12345   2019-02-17          1
12345   2019-02-17          2
12345   2019-02-17          3
-------------------------------------------------
12344   2019-02-18          1
12344   2019-02-18          3
12344   2019-02-18          2
-------------------------------------------------
12443   2019-02-19          1
12443   2019-02-19          2
12443   2019-02-19          3

我想从代码3之后更新了代码2的Sales表中检索那些项目ID,因此我的查询应返回12344作为结果...我想不出任何实现此目的的函数因为我对SQL的了解有限。有人可以给我一些实现此建议吗?谢谢

3 个答案:

答案 0 :(得分:0)

这是您要查找的查询

select sales1.itemId from sales sales1 
       inner join sales sales2 
       on sales1.itemId = sales2.itemId 
       where sales1.date > sales2.date and sales1.code = 2 and sales2.code = 3; 

检查是否对您有帮助。

答案 1 :(得分:0)

您可以添加一列

  

update_seq_no

每次更新时,您可以增加update_seq_no,然后可以使用以下sql达到所需的要求。

alter table sales add (update_seq_no number);

create SEQUENCE  IFSQ_UPDATE_SEQNO  MINVALUE 1000 MAXVALUE 9999999999999999 INCREMENT BY 1 START WITH 1 NOCYCLE ;
  -- for existing rows (just a work around) 
 BEGIN  
 for rec in (select rowid row_id,itemid,date from sales where  update_Seq_no is null order by 2,3 asc)
  loop
  update sales set update_Seq_no=IFSQ_UPDATE_SEQNO.NEXTVAL
  where rowid=rec.row_id;
  commit;
 end loop;
 end;
 --for new rows  
 insert into sales values(p_itemid,p_date,3,IFSQ_UPDATE_SEQNO.NEXTVAL);
 insert into sales values(p_itemid,p_date,2,IFSQ_UPDATE_SEQNO.NEXTVAL);


with sales1 as (select row_num1,a.* from (select rownum row_num1,b.* 
from sales b order by update_seq_no asc)a)
select a.*
from sales1 a,sales1 b
where a.row_num1-1=b.row_num1
and a.code=2 and b.code=3
and a.itemid=b.itemid
and a.Date=b.Date;

答案 2 :(得分:0)

如果每个itemid和代码只有一行,那么您可以简单地进行汇总:

select itemid
from mytable
group by itemid
having max(case when code = 2 then date end) > max(case when code = 3 then date end);

但是,对于您的示例数据,不会返回任何itemid,因为每个itemid的所有代码都具有相同的日期。没有人比其他人更重要。