为什么此查询不仅仅为我指定了帐户?

时间:2017-09-26 17:33:30

标签: sql oracle

Oracle SQL Developer 我希望看到:

在子查询中,我认为rownumber小于2.当我单独运行此查询时,它给了我2个帐户。但是,当我运行整个查询时,帐号列表就会继续!这里发生了什么?

SELECT m.acctno, i.intervalstartdate, d.name, i.intervalvalue
FROM endpoints E
JOIN meters m on m.acctid = e.acctid
LEFT JOIN intervaldata I ON I.acctid = M.acctid
LEFT JOIN endpointmodels EM ON EM.endpointmodelid=E.hwmodelid
LEFT JOIN datadefinitions D ON D.datadefinitionid = I.datadefinitionid
WHERE 1=1
AND E.statuscodeid = 8
AND m.FORM = 2
and exists
( 
   SELECT m2.acctno
    from acct m2
    where m2.acctno is not null
    --and m2.acctno=m2.acctno
    and rownum <= 2

 )
AND D.datadefinitionid =7077
AND I.intervalstartdate BETWEEN '24-SEP-2017 00:00' and '25-SEP-2017 00:00' 
--TRUNC(sysdate - 1) + interval '1' hour AND TRUNC(sysdate - 1) + interval 
'24' hour
ORDER BY M.acctno, I.intervalstartdate, I.datadefinitionid

这个查询应该为每个帐户提供97行。我正在读取的数据,即间隔值,是我们在96个时间间隔内为每个客户报告的数据。所以我期待2个帐户,例如,获得194行。我想现在测试2个帐户,但是我想要运行50,000个帐户。所以2,它甚至没有工作。只给我两个帐户的数百万行。基本上,我认为我的行号num行被忽略了。我不能使用in子句,因为我无法将50,000个帐户传入其中。所以我使用了exists运算符。 让我知道!

2 个答案:

答案 0 :(得分:0)

一个明显的错误是日期条件,您需要在两个STRINGS之间的日期。如果您以字符串格式保留日期,您将遇到数以千计的问题和错误,并且您无法修复它们。

您是否理解&#39; 25-APR-2008 00:00:00&#39;在2017年9月24日至00日00:00至00:00之间和&#39; 25-SEP-2017 00:00:00&#39;,如果你比较按字母顺序(作为字符串)?

解决方案是确保日期列处于DATE(或TIMESTAMP)数据类型,然后比较日期,而不是字符串。

顺便说一句 - 这不会导致任何错误,但它仍然是错误的代码 - 在EXISTS情况下,你有一个ROWNUM&lt; = 2的条件。你认为这会做什么?子查询要么返回至少一行(第一行将自动具有ROWNUM = 1),要么它不会。 EXISTS条件中该子查询中ROWNUM的条件只是垃圾。

答案 1 :(得分:-1)

我认为错误在于尝试使用and exists (...)子句。如果子查询返回任何行,则exists谓词返回true。因此,在您的情况下,除非表为空,否则exists的结果将始终为真。这意味着它对外部查询没有任何影响。你需要使用像

这样的东西
inner join (SELECT m2.acctno
from acct m2
where m2.acctno is not null
--and m2.acctno=m2.acctno
and rownum <= 2) sub1 
on sub1.acctno = m.acctno

获取您想要的内容,而不是and exists (...)