鉴于在SQLite中,View
s:
UPDATE
d,以下是这种情况:
有4个表A
,B
,C
和D
,并且必须使用来自所有四个表的数据有条件地创建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
触发器)如何提供此要求?
非常感谢数据库专家是否可以发布 精确 结构。很多,非常感谢提前!
答案 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子句中的比较将失败。)