静态列表MINUS select语句

时间:2014-04-25 08:24:54

标签: java sql oracle

我有一个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

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

2 个答案:

答案 0 :(得分:2)

案例1:

使用全球临时表(GTT):

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

将列表(长值)插入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);

答案 1 :(得分:0)

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

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

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

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