Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何编写oracle查询作为通用的联合替代方法_Java_Performance_Oracle_Oracle10g - Fatal编程技术网

Java 如何编写oracle查询作为通用的联合替代方法

Java 如何编写oracle查询作为通用的联合替代方法,java,performance,oracle,oracle10g,Java,Performance,Oracle,Oracle10g,我有一个包含大量数据集的表attach,它是一个临时表,由sql创建: id number name 1 X1 name1 2 X2 name2 3 X3 name3 4 X4 name4 表附件\u地图 id item attach_id file_id versionid 1 X1 1 100

我有一个包含大量数据集的表
attach
,它是一个临时表,由sql创建:

    id   number   name
    1      X1     name1
    2      X2     name2
    3      X3     name3
    4      X4     name4
附件\u地图

    id    item    attach_id  file_id  versionid
    1      X1       1          100         0
    2      X2       0           0          1
版本

   id    attach_id   
    1      2       
我想通过查询获取:

    id   number   name    item
    1      X1     name1    X1
    2      X2     name2    X2
    3      X3     name3
    4      X4     name4
如您所见,返回行添加了新列,该列实际上来自表
附件\u map
,有三种不可能的情况:

1) .
附加
没有项目

2) 。通过连接到
附件地图
附件id
列,获取项目

2) 。通过连接到
版本
列,获取项目

我写了一个查询,但性能很差,执行速度很慢,而且似乎是因为联合。每个人都能告诉我另一种方法或者我如何即兴创作吗?谢谢

 WITH tb AS
(SELECT t.*,
 i.item
 FROM attach t,
  attachment_map am,
  version v
 WHERE (am.attach_id = t.attachid
OR (am.file_id      = 0
AND am.version_id   = v.id))
)
SELECT * FROM tb
UNION
SELECT tb.*, NULL FROM tb, attach WHERE tp.id NOT IN (attach.id);

使用两个
LEFT-OUTER-JOIN
s链接三个表,然后按优先级顺序使用
CASE
item
字段(首先检查附件,然后检查附件映射,然后检查版本)


别名“i”指的是什么(i.item)?不是一个完整的左连接,因为正如我所提到的,有三种不可能获得item value而不是case表达式,你能直接在各种项上使用coalesce吗?@Tom:是的,这也应该行得通(我认为coalesce是SQL标准,在这种情况下更好一些)我相信
合并
案例
都在标准中。这并不是说数据库中可用的实现符合标准!
SELECT t.*
, case when t.attach_id is null then
    case when am.attach_id is null then
        v.item
    else
        am_attach.item
    end
else
    t.item
end as chosen_item

FROM attach t
left outer join attachment_map am on am.attach_id = t.attachid
left outer join version v on am.version_id   = v.id