Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何克服SQLite视图的局限性_Sql_Database_Sqlite - Fatal编程技术网

如何克服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

鉴于在SQLite中,
View
s:

  • 是只读的
  • 不能
    UPDATE
    d
情况如下:

共有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 
    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等人!