2014-05-24 129 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

是的 - 失去了独特性,你只是混淆了这个问题。 –