若一個視圖是從單個基本表導出來的,並且只是去掉了基本表的某些行和某些列,但保留了主碼,我們稱這類視圖為行列子集視圖。
RDBMS執行對視圖的查詢時,首先進行有效性檢查,檢查查詢中涉及的表、視圖等是否存在。如果存在,則從數據字典中取出視圖的定義,把定義中的子查詢和用戶的查詢結合起來,轉換成等價的對基本表的查詢,然後再執行修正後了的查詢。這一轉換過程成為視圖消解(View Resolution)。
例如:
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept="IS"
WITH CHECK OPTION;
SELECT Sno,Sage
FROM IS_Student
WHERE Sage<20;
本例轉換後的查詢語句為:
SELECT Sno,Sage
FROM Student
WHERE Sdept="IS" AND Sage<20;
本查詢涉及視圖IS_Student(虛表)和基本表SC,通過這兩個表的連線來完成用戶請求。
在一般情況下,視圖查詢的轉換是直截了當的。但有些情況下,這種轉換不能直接進行,查詢時就會出現問題
CREATE VIEW S_G(SNO,Gavg)
AS
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno
SELECT *
FROM S_G
WHERE Gavg>=90;
將上面兩種查詢結合,形成下列查詢語句:
SELECT Sno,AVG(Grade)
FROM SC
WHERE AVG(Grade) >=90
GROUP BY Sno;
因為WHERE子句中是不能用聚集函式作為條件表達式的,因此執行此修正後的查詢將會出現語法錯誤。正確轉換的查詢語句是:
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG(Grade) >=90
目前多數關係資料庫系統對行列子集視圖的查詢均能進行正確轉換。但對非行列子集視圖的查詢就不一定能做轉換了,因此這類查詢應該直接對基本表進行。