如何克服SQLite View限制

时间:2015-07-22 08:05:43

标签: sql database sqlite

鉴于在SQLite中,View s:

  • 是只读的
  • 不能是UPDATE d,

以下是这种情况:

有4个表ABCD,并且必须使用来自所有四个表的数据有条件地创建View。这是伪结构:

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中是否匹配,都应填充剩余的匹配项(E中的列的D视图中的值为0)。不用说,如果 匹配D行,则上述结构有效,但如果没有D匹配,则显然会返回空视图。

CASE语句或SELECT子查询(或完全不同的构造,如INSTEAD OF触发器)如何提供此要求?

非常感谢数据库专家是否可以发布 精确 结构。很多,非常感谢提前!

1 个答案:

答案 0 :(得分:1)

首先,使用显式连接:

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';

如果您想保留没有匹配的行,则可以使用outer join

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对于缺失的行是NULL,并且WHERE子句中的比较将失败。)