我正在使用Oracle10g。
我想从桌子上找到明天的遗失记录。以下是我到目前为止所尝试的查询。
select distinct P.PID, P.CITY from PROFILES P, TABLE2 T2
where T2.PID = P.PID
and P.PID not in (select PID from TABLE2 where DELDATE=trunc(sysdate+1))
order by P.CITY, P.PID
以下是表格结构(简化):
PROFILES
PID varchar2(10)
PNAME varchar2(50)
CITY varchar2(20)
TABLE2
PID varchar2(10)
DELDATE date
QTY number
TABLE2包含客户的交付(交付/预期),我想获得明天没有交付的客户。
上面的查询给出了我的输出作为扩展,即所有在明天没有记录的PID在TABLE2中。
我的问题是,这个查询可以写得更优雅吗?具体而言,不使用not in
。
答案 0 :(得分:1)
select P.PID, P.CITY
from PROFILES P join TABLE2 T2 on T2.PID = P.PID
group by P.PID, P.CITY
having sum(case when T2.DELDATE=trunc(sysdate+1) then 1 else 0 end) = 0;
答案 1 :(得分:1)
所以你只是加入table2才能检查此表中是否存在配置文件?
select pid, city
from profiles
where pid in (select pid from table2)
and pid not in (select pid from table2 where deldate = trunc(sysdate) + 1);
因为两个条件(pid必须在table2中,而pid必须不在table2中,明天才有deldate)参考同一个表,你可以一次完成:
select pid, city
from profiles
where pid in
(
select pid
from table2
group by pid
having count(case when deldate = trunc(sysdate) + 1 then 1 end) = 0
);