我正在处理一个数据模型,我计划将一个表中的列拆分为多个表,因为不同列的预期更新频率可能会有很大差异。我仍然希望有一个单一的视图,输出所有表都是一个的说明。
基本上我有一个名字作为主键,我使用一个单独的ID表(ID, NAME)
,其中ID
是唯一的主键来标识相应的行。我还有一个创建者表(ID, NAME)
,它将冗长的名字Map到ID。主要数据被分成两个表,每个表都有一个ID
列用于与ID表相关联。
长话短说,下面是一个愚蠢的示例数据集的表定义:
BEGIN TRANSACTION;
CREATE TABLE KEY_ID (ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, NAME VARCHAR(32));
INSERT INTO KEY_ID VALUES(1,'Name');
CREATE TABLE CREATORS (ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, NAME VARCHAR(32));
INSERT INTO CREATORS VALUES(1,'Creator');
CREATE TABLE KEY_DATA (ID INTEGER PRIMARY KEY NOT NULL REFERENCES KEY_ID(ID), KEY_DATA VARCHAR(4096), CREATOR_ID INTEGER not NULL REFERENCES CREATORS(ID), CREATED DATETIME, MODIFIED DATETIME, LOCKED DATETIME);
INSERT INTO KEY_DATA VALUES(1,'K',1,0,0,0);
CREATE TABLE KEY_PROT (ID INTEGER PRIMARY KEY NOT NULL REFERENCES KEY_ID(ID), DK_DATA VARCHAR(128), KEK_DATA VARCHAR(128));
INSERT INTO KEY_PROT VALUES(1,'X','Y');
DELETE FROM sqlite_sequence;
INSERT INTO sqlite_sequence VALUES('KEY_ID',1);
CREATE VIEW V AS SELECT KEY_ID.NAME AS NAME, KEY_DATA, CREATORS.NAME AS CREATOR, CREATED, MODIFIED, LOCKED, KEY_PROT.DK_DATA AS DK_DATA, KEY_PROT.KEK_DATA AS KEK_DATA FROM KEY_ID, CREATORS, KEY_DATA, KEY_PROT JOIN ID ON KEY_ID.ID = KEY_DATA.ID JOIN ID ON KEY_PROT.ID = KEY_DATA.ID JOIN ID ON CREATORS.ID = KEY_DATA.ID;
COMMIT;
当查询视图时,我得到了他的错误消息:
sqlite> select * from V;
Parse error: no such table: main.ID
让我困惑的是,我的视图不包含任何名为main
的表。也许while问题可以改为“* 如何在SQLite视图中Map外键关系?*”。
尝试解决问题
在阅读了SQLite INNER JOIN with Examples中的“SQLite INNER JOIN examples”之后,我仍然没有成功,所以我试图首先使用SELECT
获得所需的结果,但即使这样也失败了:
sqlite> CREATE VIEW V AS SELECT KEY_ID.NAME AS NAME, KEY_DATA, CREATORS.NAME AS CREATOR, CREATED, MODIFIED, LOCKED, KEY_PROT.DK_DATA AS DK_DATA, KEY_PROT.KEK_DATA AS KEK_DATA FROM KEY_ID, CREATORS, KEY_DATA, KEY_PROT FROM KEY_ID INNER JOIN ID ON KEY_ID.ID = KEY_DATA.ID INNER JOIN ID ON KEY_PROT.ID = KEY_DATA.ID INNER JOIN ID ON CREATORS.ID = KEY_DATA.ID;
Parse error: near "FROM": syntax error
EK_DATA FROM KEY_ID, CREATORS, KEY_DATA, KEY_PROT FROM KEY_ID INNER JOIN ID ON
error here ---^
sqlite> SELECT KEY_ID.NAME AS NAME, KEY_DATA, CREATORS.NAME AS CREATOR, CREATED, MODIFIED, LOCKED, KEY_PROT.DK_DATA AS DK_DATA, KEY_PROT.KEK_DATA AS KEK_DATA FROM KEY_ID, CREATORS, KEY_DATA, KEY_PROT INNER JOIN KEY_ID ON KEY_ID.ID = KEY_DATA.ID INNER JOIN KEY_ID ON KEY_PROT.ID = KEY_DATA.ID INNER JOIN KEY_DATA ON CREATORS.ID = KEY_DATA.CREATOR_ID;
Parse error: ambiguous column name: KEY_ID.NAME
SELECT KEY_ID.NAME AS NAME, KEY_DATA, CREATORS.NAME AS CREATOR, CREATED, MODIF
^--- error here
1条答案
按热度按时间b1payxdu1#
我在answer https://dba.stackexchange.com/a/267839/272354中找到了基本的提示,这意味着有 * 父表 * 和 * 子表 *。基本上SQLite的错误消息不是很有用,解决方案是删除
SELECT
中的大多数AS
短语,并以FROM
和 * 父表 *(KEY_ID
)开始。因此,我正在“分解”视图,如下面的编号列表:
CREATE VIEW V_KEY_FLAT AS
# the viewSELECT KEY_ID.NAME, KEY_DATA, CREATORS.NAME AS CREATOR, CREATED, MODIFIED, LOCKED, KEY_PROT.DK_DATA, KEY_PROT.KEK_DATA
# the * 字段 *FROM KEY_ID
#* 父表 *INNER JOIN KEY_DATA USING (ID)
#第一个 * 子表 *INNER JOIN KEY_PROT USING(ID)
# second * 子表 *INNER JOIN CREATORS ON CREATORS.ID = KEY_DATA.CREATOR_ID;
#第三个 * 子表 * 在字段中使用不同的名称以下是执行计划:
(我不禁要问:* 谁能解释
explain
的输出?* 我似乎使用了错误的JOIN
类型)在一个新的例子中: