java如何编写oracle查询作为通用的联合替代方法
我有一个表attach
包含大量数据集,它是一个临时表,由sql创建:
id number name
1 X1 name1
2 X2 name2
3 X3 name3
4 X4 name4
表attachment_map
id item attach_id file_id versionid
1 X1 1 100 0
2 X2 0 0 1
表version
id attach_id
1 2
我想通过查询获得:
id number name item
1 X1 name1 X1
2 X2 name2 X2
3 X3 name3
4 X4 name4
正如您所看到的,返回行添加了新的列,这实际上是从表attachment_map
中获得的,有三个不可能:
1)attach
没有项目
2)。通过连接到attachment_map
的attach_id
列来获取项
2)。通过连接到version
的attach_id
列,获得项
我写了一个查询,但性能很差,执行起来很慢,似乎是因为联合。大家能告诉我另一种方法或者我如何即兴创作吗?谢谢
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);
# 1 楼答案
使用两个
LEFT OUTER JOIN
链接三个表,然后按优先级顺序CASE
链接item
字段(首先检查附件,然后检查附件映射,然后检查版本)