如何克服SQLite视图的局限性
鉴于在SQLite中,如何克服SQLite视图的局限性,sql,database,sqlite,Sql,Database,Sqlite,鉴于在SQLite中,Views: 是只读的 不能UPDATEd 情况如下: 共有4个表A、B、C和D,必须有条件地使用所有四个表中的数据创建视图。以下是伪构造: CREATE VIEW AS E SELECT A.A1, A.A2, A.A3, A.A4, B.B1, C.C1, C.C2, D.D1, D.D2 FROM A, B, C, D WHERE A.X = 'SOME STRING' AND A.FK = C.PK AND A.Y = B.Z AND
View
s:
- 是只读的
- 不能
dUPDATE
A
、B
、C
和D
,必须有条件地使用所有四个表中的数据创建视图。以下是伪构造:
CREATE VIEW AS E SELECT A.A1, A.A2, A.A3, A.A4, B.B1, C.C1, C.C2, D.D1, D.D2 FROM A, B, C, D
WHERE A.X = 'SOME STRING' AND
A.FK = C.PK AND
A.Y = B.Z AND
D.G = A.PK AND
D.H = 'SOME STRING'
要求是,无论D
中没有匹配项,其余的匹配项都应填充(对于D
中的列,视图E
中的值为0)。不用说,如果存在匹配的D
行,则上述构造可以工作,但如果没有匹配的D
行,则显然返回空视图
CASE
语句或SELECT
子查询(或完全不同的构造,如而不是触发器)如何满足这一要求
非常感谢数据库专家能够发布准确的结构。非常非常感谢 首先,使用显式联接:
SELECT A.A1, A.A2, A.A3, A.A4, B.B1, C.C1, C.C2, D.D1, D.D2
FROM A
JOIN B ON A.Y = B.Z
JOIN C ON A.FK = C.PK
JOIN D ON D.G = A.PK
WHERE A.X = 'SOME STRING'
AND D.H = 'SOME STRING';
然后,如果要保留不匹配的行,可以使用:
FROM A
JOIN B ON A.Y = B.Z
JOIN C ON A.FK = C.PK
LEFT JOIN D ON D.G = A.PK AND D.H = 'SOME STRING'
WHERE A.X = 'SOME STRING';
(比较D.H
必须是连接条件的一部分,因为D.H
对于缺少的行为空,并且在WHERE子句中比较将失败。)您是否尝试过使用LEFT join
语法而不是FROM
子句中的隐式连接?另外,请告知我们您是否必须有或可以有A、B、C和D中匹配的行,以及在每种情况下要做什么。也就是说,如果B中缺少匹配项,是否仍要从a返回该行,或者不返回该行?显示示例数据和所需结果。并且可以使用触发器使视图可更新。@LasseV.Karlsen,-还没有尝试左连接A、B、C和D中必须有匹配的行。如果D中没有匹配项,则视图中的D1和D2应为零。谢谢@CL,在小提琴上工作。同时,请解释如何使用触发器更新视图。谢谢@CL.,请在从表中删除记录之前和之后运行。谢谢这个答案帮助很大,并且根据这个概念满足了需求。非常感谢你!不知道为什么这个问题被否决了。尽管如此,我还是希望这次讨论能对SO用户有所帮助。再次感谢你,CL等人!