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

ご覧のとおり、戻り行には実際にテーブルから取得した新しい列が追加されattachment_mapています。3つの不可能な点があります。

1)。attachアイテムがありません。

attach_id2)。の列に接続してアイテムを持っていますattachment_map

attach_id2)。の列に接続してアイテムを持っていますversion

クエリを作成しましたが、パフォーマンスが低く、実行が遅く、結合が原因のようです。誰もが別の方法を教えてもらえますか、それとも私がそれを改善する方法はありますか?ありがとう

 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

2つLEFT OUTER JOINのsを使用して、3つのテーブルをリンクし、次に優先度の順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 に答える