2012-08-09 53 views
1

我正在Oracle中做我的功課。修改oracle中的一個視圖

我必須創建一個複雜的視圖,創建視圖後,我必須修改它。

這個問題說,當存在沒有department_name時,視圖的創建必須能夠處理這種情況。我不確定是否必須使用這個NVL(d.department_name, 'No department established yet')

第二個問題是我必須修改視圖以將列名更改爲別名(如department_name)爲「部門」,並將其他國家/地區包含在未包含的視圖中在視圖中。以下是我創建的視圖,我需要幫助。

CREATE VIEW jack_vu AS 
SELECT NVL(d.department_name, 'No department established yet') "department_name" 
    , l.city 
    , l.state_province 
    FROM locations l 
    JOIN departments d 
    ON (l.location_id = d.location_id) 
WHERE UPPER(l.country_id) LIKE 'CA' 
    OR UPPER(l.country_id) LIKE 'IT'; 

回答

2

看起來你在這裏正確的軌道上。 NVL函數用於處理空值,所以看起來沒問題。您已經在使用別名「department_name」。您也可以使用正常列的別名,即:select column_name作爲表中的「別名」;

您也可以使用「創建或替換視圖...」更改已存在的視圖。

+0

我實際上使用了CREATE OR REPLACE。但我不確定這是否會被視爲對觀點的修改? – Jack 2012-08-09 06:37:57

+1

不,但如果你想創建一個已經存在的視圖,你首先必須刪除它。或者使用create或replace。 – Rene 2012-08-09 07:33:18

1

的NVL()是正確的事情,但因爲你的查詢使用「INNER JOIN」

你永遠不會爲deparment_name空值(除非一個存儲在departments表)

您想要的是在位置和部門之間使用外部連接,這些連接將在結果中包含尚未分配給部門的位置。

LIKE運算符不需要順便說一句。因爲你正在進行平等檢查。爲了使加入的國家更容易,使用IN運營商將是打字少(雖然OR會工作得很好)

SELECT ... 
FROM locations l 
    LEFT JOIN departments d ON (l.location_id = d.location_id) -- the LEFT is the difference 
WHERE UPPER(l.country_id) IN ('CA','IT'); -- add more countries here. 

你可能需要閱讀了關於外連接,如果你不明白髮生了什麼這裏(例如:http://www.devx.com/dbzone/Article/17403/1954?pf=true

您已經知道如何通過爲別名「department_name」提供別名「department_name」給NVL函數的結果賦予一個新名稱。所以如果這應該被命名爲「部門」,只需更改名稱。我個人更喜歡使用AS來引入列別名。我認爲它使意圖更清楚。

SELECT NVL(d.department_name, 'No department established yet') as "Departments" 
+0

好的謝謝。但是修改呢?創建視圖後 – Jack 2012-08-09 07:11:07

+1

@ahmadhussain:像你已經做的那樣使用'CREATE OR REPLACE'。 **被認爲改變了觀點。 – 2012-08-09 09:01:34