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