是否可以以编程方式编辑 SQLite CREATE VIEW 语句?
Is it possible to programmatically edit a SQLite CREATE VIEW statement?
我有一个包含多个嵌套视图的视图,如下所示。
主视图:
CREATE VIEW `qryAttackRate` AS
Select qryFoodInCases.fldCaseID,qryFoodInCases.fldFood,
AteAndGotSick,TotalAte,AteAttackRate,
NotAteAndGotSick,TotalNotAte,NotAteAttackRate,
ROUND(AteAttackRate/CAST(NotAteAttackRate AS FLOAT),2) RelativeRisk
FROM qryFoodInCases
LEFT JOIN qryNotAteAttackRate QA
ON qryFoodInCases.fldFood=QA.fldFood
LEFT JOIN qryAteAttackRate QN
ON qryFoodInCases.fldFood=QN.fldFood
GROUP BY qryFoodInCases.fldFood
ORDER BY RelativeRisk Desc
这是 2 个子视图。还有几个:
CREATE VIEW `qryAteAttackRate`
AS SELECT qryFoodInCases.fldCaseID,qryFoodInCases.fldFood,
COALESCE(qryAteAndGotSick.AteAndGotSick,0) AteAndGotSick,
qryFoodInCases.fldFoodFrequency TotalAte,
100*COALESCE(qryAteAndGotSick.AteAndGotSick,0)/
qryFoodInCases.fldFoodFrequency AteAttackRate
FROM qryFoodInCases
LEFT JOIN qryAteAndGotSick
ON qryFoodInCases.fldFood=qryAteAndGotSick.fldFood
GROUP BY qryFoodInCases.fldFood
CREATE VIEW `qryFoodInCases`
AS SELECT tblCases.fldCaseID,fldfood,
COUNT(tblFoodHistory.fldFoodID) AS fldFoodFrequency
FROM tblFood
INNER JOIN tblFoodHistory
ON tblFoodHistory.fldFoodID=tblFood.fldFoodID)
INNER JOIN tblMealHistory
ON tblFoodHistory.fldMealID=tblMealHistory.fldMealHistoryID)
INNER JOIN tblInterviews
ON tblInterviews.fldInterviewID=tblMealHistory.fldInterviewID)
INNER JOIN tblCases
ON tblCases.fldCaseID=tblInterviews.fldCaseID
GROUP BY tblCases.fldCaseID,tblFood.fldFood
我想查询每个 fldCaseID 的主视图。问题是,查询主视图时的 WHERE 条件不适用于子视图。
除了创建长而复杂的 SQL 语句之外,是否可以通过编程方式将 WHERE 条件插入子视图?
为了说明问题,请查看 select * from qryAttackRate where fldcaseid=1
在添加第二个案例之前和之后的输出,而不对与第一个案例相关的数据进行任何更改
之前
+-----------+------------+---------------+----------+---------------+------------------+-------------+------------------+--------------+
| fldCaseID | fldFood | AteAndGotSick | TotalAte | AteAttackRate | NotAteAndGotSick | TotalNotAte | NotAteAttackRate | RelativeRisk |
+-----------+------------+---------------+----------+---------------+------------------+-------------+------------------+--------------+
| 1 | Beans | 4 | 4 | 100 | 1 | 3 | 33 | 3.03 |
| 1 | Cabagge | 2 | 3 | 66 | 3 | 4 | 75 | 0.88 |
| 1 | fried fish | 2 | 3 | 66 | 3 | 4 | 75 | 0.88 |
| 1 | Banana | 1 | 2 | 50 | 4 | 5 | 80 | 0.62 |
| 1 | Pork | 2 | 4 | 50 | 3 | 3 | 100 | 0.5 |
| 1 | Chicken | 1 | 3 | 33 | 4 | 4 | 100 | 0.33 |
| 1 | Potatoes | 0 | 2 | 0 | 5 | 5 | 100 | 0 |
| 1 | Rice | 0 | 2 | 0 | 5 | 5 | 100 | 0 |
+-----------+------------+---------------+----------+---------------+------------------+-------------+------------------+--------------+
之后
+-----------+------------+---------------+----------+---------------+------------------+-------------+------------------+--------------+
| fldCaseID | fldFood | AteAndGotSick | TotalAte | AteAttackRate | NotAteAndGotSick | TotalNotAte | NotAteAttackRate | RelativeRisk |
+-----------+------------+---------------+----------+---------------+------------------+-------------+------------------+--------------+
| 1 | Cabagge | 2 | 3 | 66 | 4 | 7 | 57 | 1.16 |
| 1 | fried fish | 2 | 3 | 66 | 4 | 7 | 57 | 1.16 |
| 1 | Pork | 2 | 4 | 50 | 4 | 6 | 66 | 0.76 |
| 1 | Potatoes | 0 | 2 | 0 | 6 | 8 | 75 | 0 |
+-----------+------------+---------------+----------+---------------+------------------+-------------+------------------+--------------+
视图总是在应用外部查询中的任何处理之前计算固定的结果集。 (数据库实际上试图优化掉视图中不需要的处理,但它总是表现得好像视图是提前具体化的。)
无法更改视图(使用参数或任何其他机制)。
如果您的子查询必须动态更改,则不能使用视图。
您必须将它们写成子查询,或者(在 SQLite 3.8.3 或更高版本中)写成 common table expressions.
我有一个包含多个嵌套视图的视图,如下所示。
主视图:
CREATE VIEW `qryAttackRate` AS
Select qryFoodInCases.fldCaseID,qryFoodInCases.fldFood,
AteAndGotSick,TotalAte,AteAttackRate,
NotAteAndGotSick,TotalNotAte,NotAteAttackRate,
ROUND(AteAttackRate/CAST(NotAteAttackRate AS FLOAT),2) RelativeRisk
FROM qryFoodInCases
LEFT JOIN qryNotAteAttackRate QA
ON qryFoodInCases.fldFood=QA.fldFood
LEFT JOIN qryAteAttackRate QN
ON qryFoodInCases.fldFood=QN.fldFood
GROUP BY qryFoodInCases.fldFood
ORDER BY RelativeRisk Desc
这是 2 个子视图。还有几个:
CREATE VIEW `qryAteAttackRate`
AS SELECT qryFoodInCases.fldCaseID,qryFoodInCases.fldFood,
COALESCE(qryAteAndGotSick.AteAndGotSick,0) AteAndGotSick,
qryFoodInCases.fldFoodFrequency TotalAte,
100*COALESCE(qryAteAndGotSick.AteAndGotSick,0)/
qryFoodInCases.fldFoodFrequency AteAttackRate
FROM qryFoodInCases
LEFT JOIN qryAteAndGotSick
ON qryFoodInCases.fldFood=qryAteAndGotSick.fldFood
GROUP BY qryFoodInCases.fldFood
CREATE VIEW `qryFoodInCases`
AS SELECT tblCases.fldCaseID,fldfood,
COUNT(tblFoodHistory.fldFoodID) AS fldFoodFrequency
FROM tblFood
INNER JOIN tblFoodHistory
ON tblFoodHistory.fldFoodID=tblFood.fldFoodID)
INNER JOIN tblMealHistory
ON tblFoodHistory.fldMealID=tblMealHistory.fldMealHistoryID)
INNER JOIN tblInterviews
ON tblInterviews.fldInterviewID=tblMealHistory.fldInterviewID)
INNER JOIN tblCases
ON tblCases.fldCaseID=tblInterviews.fldCaseID
GROUP BY tblCases.fldCaseID,tblFood.fldFood
我想查询每个 fldCaseID 的主视图。问题是,查询主视图时的 WHERE 条件不适用于子视图。
除了创建长而复杂的 SQL 语句之外,是否可以通过编程方式将 WHERE 条件插入子视图?
为了说明问题,请查看 select * from qryAttackRate where fldcaseid=1
在添加第二个案例之前和之后的输出,而不对与第一个案例相关的数据进行任何更改
之前
+-----------+------------+---------------+----------+---------------+------------------+-------------+------------------+--------------+
| fldCaseID | fldFood | AteAndGotSick | TotalAte | AteAttackRate | NotAteAndGotSick | TotalNotAte | NotAteAttackRate | RelativeRisk |
+-----------+------------+---------------+----------+---------------+------------------+-------------+------------------+--------------+
| 1 | Beans | 4 | 4 | 100 | 1 | 3 | 33 | 3.03 |
| 1 | Cabagge | 2 | 3 | 66 | 3 | 4 | 75 | 0.88 |
| 1 | fried fish | 2 | 3 | 66 | 3 | 4 | 75 | 0.88 |
| 1 | Banana | 1 | 2 | 50 | 4 | 5 | 80 | 0.62 |
| 1 | Pork | 2 | 4 | 50 | 3 | 3 | 100 | 0.5 |
| 1 | Chicken | 1 | 3 | 33 | 4 | 4 | 100 | 0.33 |
| 1 | Potatoes | 0 | 2 | 0 | 5 | 5 | 100 | 0 |
| 1 | Rice | 0 | 2 | 0 | 5 | 5 | 100 | 0 |
+-----------+------------+---------------+----------+---------------+------------------+-------------+------------------+--------------+
之后
+-----------+------------+---------------+----------+---------------+------------------+-------------+------------------+--------------+
| fldCaseID | fldFood | AteAndGotSick | TotalAte | AteAttackRate | NotAteAndGotSick | TotalNotAte | NotAteAttackRate | RelativeRisk |
+-----------+------------+---------------+----------+---------------+------------------+-------------+------------------+--------------+
| 1 | Cabagge | 2 | 3 | 66 | 4 | 7 | 57 | 1.16 |
| 1 | fried fish | 2 | 3 | 66 | 4 | 7 | 57 | 1.16 |
| 1 | Pork | 2 | 4 | 50 | 4 | 6 | 66 | 0.76 |
| 1 | Potatoes | 0 | 2 | 0 | 6 | 8 | 75 | 0 |
+-----------+------------+---------------+----------+---------------+------------------+-------------+------------------+--------------+
视图总是在应用外部查询中的任何处理之前计算固定的结果集。 (数据库实际上试图优化掉视图中不需要的处理,但它总是表现得好像视图是提前具体化的。)
无法更改视图(使用参数或任何其他机制)。
如果您的子查询必须动态更改,则不能使用视图。 您必须将它们写成子查询,或者(在 SQLite 3.8.3 或更高版本中)写成 common table expressions.