0
我有一個包含數據和元數據表的數據庫。我想創建一個視圖,選擇屬於某個項目的某些元數據並將其列爲列。查詢優化:將元數據連接到值列表表
該視圖的基本查詢是:SELECT * FROM item
。該項目表被定義爲:
CREATE TABLE item (
id INTEGER PRIMARY KEY AUTOINCREMENT
UNIQUE
NOT NULL,
traceid INTEGER REFERENCES trace (id)
NOT NULL,
freq BIGINT NOT NULL,
value REAL NOT NULL
);
添加遵循的模式「metadata.parameter =‘名稱’」的元數據
元表被定義爲:
CREATE TABLE metadata (
id INTEGER PRIMARY KEY AUTOINCREMENT
UNIQUE
NOT NULL,
parameter STRING NOT NULL
COLLATE NOCASE,
value STRING NOT NULL
COLLATE NOCASE,
datasetid INTEGER NOT NULL
REFERENCES dataset (id),
traceid INTEGER REFERENCES trace (id),
itemid INTEGER REFERENCES item (id)
);
應該按照以下方式選擇「名稱」參數:
- 如果記錄存在,其中參數爲「name」且itemid與item.id,t匹配如果它的價值應該包含在記錄中。
- 否則,如果參數爲「name」,「itemid」爲NULL且traceid與item.traceid匹配的記錄存在,則應使用其值
- 否則,結果應爲NULL,但記錄來自項目表應反正目前包括
,我用下面的查詢來實現這一目標:
SELECT i.*,
COALESCE (
MAX(CASE WHEN m.parameter='name' THEN m.value END),
MAX(CASE WHEN m2.parameter='name' THEN m2.value END)
) AS itemname
FROM item i
JOIN metadata m
ON (m.itemid = i.id AND m.parameter='name')
JOIN metadata m2
ON (m2.itemid IS NULL AND m2.traceid = i.traceid AND m2.parameter='name')
GROUP BY i.id
該查詢然而有些低效,作爲元數據表使用了兩次,幷包含更多的記錄不僅僅是「名字」。因此,我正在尋找一種提高速度的方式,特別是對於一些擴展是即將實施的情況下:
還有第三級「數據集」應該包括:一個「參數=名字」如果與itemid具有相同的datasetid(如果沒有「itemid」匹配或「traceid」匹配時沒有「parameter = name」,則通過搜索其他連接traceid和datasetid的項目來查找它們)
多個元數據應該由視圖相同的架構
任何幫助表示讚賞。
我已經想到了這種方式,但它不起作用: 1.如果「name」字段與「metadata.traceid = item.tracid」一起存在並且與「metadata.itemid = NULL」和「metadata.itemid = xxxx(任何id)」一起存在,則選擇錯誤的元項目 2.對於更多列,它不容易擴展,例如我想從元字段「source」追加一個附加列 – Mike
1.實際上,使用此查詢,itemId = xxxx和traceId = xxxx是不可能的。因爲如果僅在itemId爲null時才考慮traceId。 2.我同意這裏。這是易於擴展的代碼和性能之間的折衷。 – Max