2012-11-28 42 views
0
CREATE VIEW hd3_b 
AS 
    SELECT CASE 
      WHEN hd.country_visited = 'USA' THEN 'AMERICA' 
      WHEN hd.country_visited = 'India' THEN 'ASIA' 
      WHEN hd.country_visited = 'CHINA' THEN 'ASIA' 
      WHEN hd.country_visited = 'SPAIN' THEN 'EUROPE' 
      ELSE hd.country_visited 
     END AS hd.COUNTRY_VISITED 
    FROM holiday_details hd 
    UNION 
    SELECT hd.holiday_desc, 
     holiday_code 
    FROM holiday_details hd 

這是我現在擁有的代碼,我不斷從FROM丟失錯誤或MISSING KEYWORD錯誤中獲取代碼。SQL語法的問題

任何人都可以在我的語法中看到任何致盲錯誤?

+0

這將有助於,如果你可以發佈你正在得到確切的錯誤消息。 –

+0

ORA-00923:在預期的地方找不到FROM關鍵字, –

+0

從第二個選擇中刪除其中一列沒有解決問題 –

回答

0

嘗試

CREATE VIEW hd3_b 
AS 
    SELECT CASE 
      WHEN hd.country_visited = 'USA' THEN 'AMERICA' 
      WHEN hd.country_visited = 'India' THEN 'ASIA' 
      WHEN hd.country_visited = 'CHINA' THEN 'ASIA' 
      WHEN hd.country_visited = 'SPAIN' THEN 'EUROPE' 
      ELSE hd.country_visited 
     END AS COUNTRY_VISITED 
    FROM holiday_details hd 
    UNION 
    SELECT hd.holiday_desc, 
     hd.holiday_code 
    FROM holiday_details hd 

你不需要HD。在thisl線

END AS COUNTRY_VISITED

因爲COUNTRY_VISITED是一個別名,你不需要用表的別名

4

你有幾個錯誤preceed它。您似乎選擇了具有SELECT語句的不同列數。當您使用UNION列數必須等於:

CREATE VIEW hd3_b 
AS 
    SELECT CASE 
      WHEN hd.country_visited = 'USA' THEN 'AMERICA' 
      WHEN hd.country_visited = 'India' THEN 'ASIA' 
      WHEN hd.country_visited = 'CHINA' THEN 'ASIA' 
      WHEN hd.country_visited = 'SPAIN' THEN 'EUROPE' 
      ELSE hd.country_visited 
     END AS COUNTRY_VISITED, -- remove the hd alias 
     Null as PlaceholderColumn 
    FROM holiday_details hd 
    UNION 
    SELECT hd.holiday_desc, 
     holiday_code 
    FROM holiday_details hd 

您還可以在第一選擇列名錶別名。

如果你只想要回一列,那麼你將要使用:

CREATE VIEW hd3_b 
AS 
    SELECT CASE 
      WHEN hd.country_visited = 'USA' THEN 'AMERICA' 
      WHEN hd.country_visited = 'India' THEN 'ASIA' 
      WHEN hd.country_visited = 'CHINA' THEN 'ASIA' 
      WHEN hd.country_visited = 'SPAIN' THEN 'EUROPE' 
      ELSE hd.country_visited 
     END AS COUNTRY_VISITED -- remove the hd alias 
    FROM holiday_details hd 
    UNION 
    SELECT hd.holiday_desc 
    FROM holiday_details hd 

除了具有在每個SELECT相同數量的列的查詢,你也需要有相同的數據類型每列。如果它們不相同,那麼您將需要執行任何列的CAST以使數據類型相同。

+0

+1 - 你比我快26秒 – Lamak

+0

第一個解決方案更合適,因爲我需要同時擁有holiday_Desc和Holiday_code,但現在不是缺少FROM,我在兩個解決方案上都遇到了字符集錯配。任何想法是什麼造成的? Country_Visited是一個NVARCHAR,就像Holiday_desc一樣,Holiday_code是一個數字 –

+0

@TBetts,如果你得到的數據類型不匹配,那麼你需要將這兩個數字字段都轉換成varchar2。不僅列的數量必須相同,而且數據類型也必須相同。 – Taryn

2

嗯,我確實看到一個錯誤,但沒有丟失關鍵字。您正在嘗試用不同的列數做個UNIONSELECT之間:

CREATE VIEW hd3_b 
AS 
    SELECT CASE 
      WHEN hd.country_visited = 'USA' THEN 'AMERICA' 
      WHEN hd.country_visited = 'India' THEN 'ASIA' 
      WHEN hd.country_visited = 'CHINA' THEN 'ASIA' 
      WHEN hd.country_visited = 'SPAIN' THEN 'EUROPE' 
      ELSE hd.country_visited 
     END AS hd.COUNTRY_VISITED 
    FROM holiday_details hd 
    UNION 
    SELECT holiday_desc --holiday_code This column shouldn't be here 
    FROM holiday_details 
0

我不認爲你真的想UNION - 看來你從holiday_details表中選擇在這兩種情況下。如果您想在country_visited僅僅是與相關holiday_desc和holiday_code沿列,試試這個:

CREATE VIEW hd3_b 
AS 
    SELECT CASE 
      WHEN country_visited = 'USA' THEN 'AMERICA' 
      WHEN country_visited = 'India' THEN 'ASIA' 
      WHEN country_visited = 'CHINA' THEN 'ASIA' 
      WHEN country_visited = 'SPAIN' THEN 'EUROPE' 
      ELSE country_visited 
     END AS COUNTRY_VISITED, 
    holiday_desc, 
    holiday_code 
    FROM holiday_details 

這句法應與T-SQL的工作。自從我使用Oracle來確定語法在那裏是否正確之後,這段時間太長了。