【问题标题】:Oracle SQL query doesn't show correct valueOracle SQL 查询不显示正确的值
【发布时间】:2015-07-09 20:55:00
【问题描述】:

我有一个包含以下列的表格:

  • 身份证
  • 技术
  • name_event
  • time_event

我使用以下查询计算表中值的数量

    select  1, 'Folder' as "Technology", 'Status' as "Name_Event", count(dm1.id) as "number of items", max(TO_CHAR(TO_DATE('20000101','yyyymmdd')+(SYSDATE - dm1.time_event),'hh24:mi:ss')) as "Time in system" 
    from db dm1 join db dm2 on dm1.id = dm2.id
    where dm1.technology = 'Folder' and dm1.name_event = 'status1' and NOT EXISTS(SELECT 1 FROM db dm2 WHERE dm2.name_event = 'status2' and dm2.id = dm1.id)

我做了以下插入

    INSERT INTO DB(id, technology, name_event, time_event) VALUES(1,'Folder', 'status1', 01:00:00);
    INSERT INTO DB(id, technology, name_event, time_event) VALUES(2,'Folder', 'status1', 01:00:00);
    INSERT INTO DB(id, technology, name_event, time_event) VALUES(3,'Folder', 'status1', 01:00:00);
    INSERT INTO DB(id, technology, name_event, time_event) VALUES(4,'Folder', 'status1', 01:00:00);
    INSERT INTO DB(id, technology, name_event, time_event) VALUES(5,'Folder', 'status1', 01:00:00);
    INSERT INTO DB(id, technology, name_event, time_event) VALUES(6,'Folder', 'status1', 01:00:00);
    INSERT INTO DB(id, technology, name_event, time_event) VALUES(7,'Folder', 'status1', 01:00:00);
    INSERT INTO DB(id, technology, name_event, time_event) VALUES(8,'Folder', 'status1', 01:00:00);
    INSERT INTO DB(id, technology, name_event, time_event) VALUES(9,'Folder', 'status1', 01:00:00);
    INSERT INTO DB(id, technology, name_event, time_event) VALUES(10,'Folder', 'status1', 01:00:00);
INSERT INTO DB(id, technology, name_event, time_event) VALUES(4,'Folder', 'status2', 02:00:00);
INSERT INTO DB(id, technology, name_event, time_event) VALUES(1,'Folder', 'status2', 03:00:00);

我在状态1中插入了10行,并将2移到状态2。所以我执行查询时状态1应该有8个项目,但结果是10...

我做错了什么?

【问题讨论】:

  • 如何提供这 10 个插入语句以及创建表脚本?
  • 除非我们有你的样本数据,否则我们很难看出你做错了什么——你能添加表定义和插入语句吗?
  • 能否请您提供一些表格中的示例数据,以便我们更快地提供答案
  • 您是否在同一会话中运行插入、移动命令和运行 sql?如果您不进行提交并在其他会话中运行 sql,它仍将显示旧值。 * 只是在这里检查。
  • 您确定问题出在查询中吗?您是如何移动这些值的?

标签: sql oracle select count


【解决方案1】:

在您的查询中,您是 joining dm2,但随后使用了 NOT EXISTS 相关子查询(并在该子查询中使用相同的别名)。我无法用我的设置复制问题,但这肯定会混淆一些东西!因此,请尝试不使用 db 的第二个副本,并保留 NOT EXISTS :

select  1, 'Folder' as "Technology", 'Status' as "Name_Event", count(dm1.id) as "number of items", max(TO_CHAR(TO_DATE('20000101','yyyymmdd')+(SYSDATE - dm1.time_event),'hh24:mi:ss')) as "Time in system" 
from db dm1 
where dm1.technology = 'Folder' and dm1.name_event = 'status1' and NOT EXISTS(SELECT 1 FROM db dm2 WHERE dm2.name_event = 'status2' and dm2.id = dm1.id)

【讨论】:

  • 如果您执行SELECT COUNT(*) from db dm1 where dm1.technology = 'Folder' and dm1.name_event = 'status1',您会得到什么?或者做一个SELECT * FROM ... 怎么样 - 似乎其他人在重新创建方面也有同样的困难,这可能表明你的数据中发生了一些有趣的事情
  • 至少它现在可以通过您的代码运行,我不知道为什么它没有首先出现,也许是需要进行的提交。谢谢!
【解决方案2】:

您在表中使用了另外 2 次插入,所以现在您有 10+2 总共 12 次插入,要移动数据,请使用更新语句。

update db set name_event='status2' where id=4;
update db set name_event='status4' where id=1;

【讨论】:

  • 我无法使用更新,因为我需要保留原始行;-)
  • @Guil ,您能详细说明您的要求吗?如果您保留原始行,您最终将得到两个数据,重复的 id,否则您可以保留触发器并将数据移动到另一个将保存旧数据的表,该表将反映新的更改
  • 我的要求是在状态发生变化时进行插入。在这之后我做了很多分析,因为它是一个监控表。使用重复表很愚蠢,因为实际上有超过 10 个状态,但我简化了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多