繁体   English   中英

静态列表MINUS select语句

[英]Static list MINUS select statement

我有一个java程序,它返回一个Long值列表(数百)。 我想在这个列表中减去从oracle数据库中的select中获得的值,如下所示:

SELECT 23 as num FROM DUAL UNION ALL
SELECT 17 as num FROM DUAL UNION ALL
SELECT 19 as num FROM DUAL UNION ALL
SELECT 67 as num FROM DUAL UNION ALL...
...
...
SELECT 68 as num FROM DUAL MINUS
SELECT NUM FROM MYTABLE

我认为这个操作有一些性能问题......还有其他更好的方法吗? 谢谢

情况1:

使用全局临时表(GTT):

CREATE GLOBAL TEMPORARY TABLE my_temp_table (
  column1  NUMBER
) ON COMMIT DELETE ROWS;

将List(Long值)插入my_temp_table

INSERT ALL
   INTO my_temp_table (column1) VALUES (27)
   INTO my_temp_table (column1) VALUES (32)
   INTO my_temp_table (column1) VALUES (25)
   .
   .
   .
SELECT 1 FROM DUAL;

然后:

SELECT * FROM my_temp_table 
WHERE column1 NOT IN (SELECT NUM FROM MYTABLE);

如果您有任何问题,请告诉我。


案例2:

使用TYPE表:

CREATE TYPE number_tab IS TABLE OF number;

SELECT column_value AS num
FROM TABLE (number_tab(1,2,3,4,5,6)) temp_table
WHERE NOT EXIST (SELECT 1 FROM MYTABLE WHERE MYTABLE.NUM = temp_table.num);

假设MyTable比文字值大得多,我认为最好的选择是使用临时表来存储您的值。 这样您的查询就更清晰了。

如果您在并发环境(例如,典型的Web应用程序)中工作,请使用id字段,并在完成后删除。 总结:

  • 初步:为临时值创建一个表TEMPTABLE(id,value)
  • 对于每笔交易
    • 获取新的唯一/原子id(例如,新的oracle序列值)
    • 对于每个文字值:插入temptable(new_id,value)
    • select * from temptable where id = new_id minus ...
    • 处理结果
    • 从temp_table中删除,其中id = new_id

临时表是oracle的一个很好的解决方案。 这个可以与ORM持久层一起使用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM