2015-10-18 34 views
0

我有一個視圖,其中包含多個嵌套視圖,如下所示。是否有可能以編程方式編輯SQLite CREATE VIEW語句?

主視圖:

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   | 
+-----------+------------+---------------+----------+---------------+------------------+-------------+------------------+--------------+ 
+0

WHERE子句適用於來自視圖的所有內容,就像表格一樣。你想使用什麼條件? –

+0

CL,假設說'SELECT * FROM qryAttackRate WHERE fldCaseID = 2'。 WHERE條件不會擴展到子視圖。 – Sheils

+0

當然會。你期望的結果是什麼,你真正得到了什麼? –

回答

0

甲視圖之後後在應用外部查詢中的任何處理之前,始終計算固定結果集。 (數據庫實際上試圖在視圖中優化掉不需要的處理,但它總是表現得好像事先已經實現了視圖一樣。)

無法更改視圖(使用參數或使用任何其他機制)。

如果您的子查詢必須動態更改,則不能使用視圖。 您必須將它們編寫爲子查詢,或者(在SQLite 3.8.3或更高版本中)編寫爲common table expressions

相關問題