2014-05-24 142 views
0

我在創建視圖時遇到問題。說:表達式必須是相同的數據類型。這發生在名稱上。創建Veiw時出現UNION錯誤

CREATE VIEW V_DETAILS_BY_CATEGORY AS 

    SELECT category_id, name 
     FROM category 

    UNION ALL 

    SELECT DISTINCT(category_id), COUNT(film_id) 
     FROM film_category 
     GROUP BY category_id; 

編輯:

確切proplem我已經是我想從兩個選擇Statment使用CATEGORY_ID加入resutls。

+0

使用數據的同類型的列什麼是你想用這個觀點來完成?可能有更好的方法。 – Bob

+0

@Bob我想用類別類型cat_id創建一個視圖,每個類別中的電影數量以及該類別的平均評分 – Cornelis

+0

請給我更多關於表格的細節。加入是一條路。你可以看看okaram說什麼讓你開始。 – Bob

回答

3

count(film_id)是一個數字,而name是(可能)某種形式的字符串。您可能想要執行JOIN,而不是聯合(聯合會從兩個不同的表中獲取具有相同結構的行)。而且,由於你正在做一個羣組,所以不需要區別。

你可能要像

SELECT category_id, category_name, COUNT(film_id) 
FROM film_category JOIN category USING category_id 
GROUP BY category_id, category_name; 
+0

我試過你說的,但是它出現在缺少關鍵詞 – Cornelis

+0

不幸的是,並不是所有的dbms都允許USING;嘗試on film_category.category_id = category.category_id而不是'使用category_id' – okaram

+0

另外,手邊沒有oracle服務器;可能需要括號使用,使用(category_id)...我敢肯定甲骨文支持使用... – okaram

2

工會必須包含相同類型的數據。

如果您將您的計數轉換爲任何數據類型的「名稱」字段,它可能會工作。

SELECT category_id, name FROM category 
UNION ALL 
SELECT category_id, TO_CHAR(COUNT(film_id)) FROM film_category 
GROUP BY category_id; 

但是,我okaram同意,你實際上可能會尋找一個JOIN,而不是一個UNION ALL,這就是爲什麼我問的目的。

0

在聯盟

CREATE VIEW V_DETAILS_BY_CATEGORY AS 
     SELECT category_id, name 
      FROM category 

     UNION ALL 

     SELECT category_id, CAST(COUNT(film_id) AS NVARCHAR(100)) 
      FROM film_category 
      GROUP BY category_id; 

    -------------- OR  
     SELECT category_id, name 
      FROM category 

     UNION ALL 

     SELECT category_id, LTRIM(RTRIM(STR(COUNT(film_id)))) 
      FROM film_category 
      GROUP BY category_id; 
+0

'distinct'是**不是**的功能。它是一個在選擇列表中的所有列上運行的運算符。 –

+0

是的 - 失去了獨特性,你只是混淆了這個問題。 –