【发布时间】:2017-07-02 08:56:51
【问题描述】:
我有一个包含数据表和元数据表的数据库。我想创建一个视图来选择属于某个项目的某些元数据并将其列为一列。
视图的基本查询是: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='name'”
元表定义为:
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”参数应该这样选择:
- 如果存在参数为“name”且 itemid 与 item.id 匹配的记录,则其值应包含在记录中。
- 否则,如果存在参数为“name”、“itemid”为 NULL 且 traceid 与 item.traceid 匹配的记录,则应使用其值
- 否则,结果应为 NULL,但仍应包含 item 表中的记录
目前,我使用以下查询来实现此目标:
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
然而,这个查询有点低效,因为元数据表被使用了两次,并且包含的记录比“名称”记录多得多。所以我正在寻找一种提高速度的方法,尤其是在一些扩展即将实现的情况下:
应该包含第三级“数据集”:如果“参数=名称”与项目具有相同的 datasetid,则应该使用它(将通过搜索另一个连接的项目来查找项目traceid 和 datasetid),如果不存在“参数=名称”且“itemid”匹配或“traceid”匹配
更多的元数据应该被同一个模式的视图查询
感谢任何帮助。
【问题讨论】:
标签: sql join sqlite query-optimization