0

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

如您所见,返回行添加了实际从 table 获得的新列attachment_map,有三个不可能:

1)。attach没有项目。

2).有项目,通过连接到attach_idattachment_map

2).有项目,通过连接到attach_idversion

我写了一个查询,但性能很差,执行速度很慢,似乎是因为联合。每个人都可以告诉另一种方式或我如何改进它吗?谢谢

 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);
4

1 回答 1

0

使用两个LEFT OUTER JOINs 链接三个表,然后CASEitem优先级顺序排列字段(先检查 attach,然后是 attachment_map,然后是 version)。

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
于 2012-07-21T17:33:39.677 回答