有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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_mapattach_id列来获取项

2)。通过连接到versionattach_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) 个答案

  1. # 1 楼答案

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

    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