我正在尝试为以下查询创建一个视图。
SELECT DISTINCT
products.pid AS id,
products.pname AS name,
products.p_desc AS description,
products.p_loc AS location,
products.p_uid AS userid,
products.isaproduct AS whatisit
FROM products
UNION
SELECT DISTINCT
services.s_id AS id,
services.s_name AS name,
services.s_desc AS description,
services.s_uid AS userid,
services.s_location AS location,
services.isaservice AS whatisit
FROM services
但不能这样做。我正在使用MySql查询浏览器。我得到的错误是:
只能从SELECT命令的活动结果集
创建视图
有人可以帮帮我吗?
答案 0 :(得分:7)
CREATE VIEW vw_product_services AS
SELECT DISTINCT products.pid AS id,
products.pname AS name,
products.p_desc AS description,
products.p_loc AS location,
products.p_uid AS userid,
products.isaproduct AS whatisit
FROM products
UNION
SELECT DISTINCT services.s_id AS id,
services.s_name AS name,
services.s_desc AS description,
services.s_uid AS userid,
services.s_location AS location,
services.isaservice AS whatisit
FROM services
我试过这个并且它有效! 谢谢大家:)
答案 1 :(得分:3)
您可能希望在第二个选择中切换用户ID和位置的顺序。在所有联合选择中,列名应匹配1到1.
编辑:对于查询浏览器,由于this指出“要从查询创建视图,您必须已成功执行查询。更准确地说,视图是从最近成功执行的查询创建的,不一定来自查询区域中当前的查询“
因此您需要先在查询浏览器中创建视图之前执行查询。
错误来自查询浏览器而不是mysql。
答案 2 :(得分:1)
您将不同的类型合并到同一列中。 (名称可以不同,但类型必须相同,或者至少是可自动转换的。)但正如@Learning指出的那样,看起来你已经扭曲了SELECT列的枚举。
以防万一,正确的语法(对我有用)是
CREATE VIEW myView
AS
SELECT ...
答案 3 :(得分:1)
关于UNION的一点评论。 UNION仅返回结果集的不同值。因此不需要将SELECT DISTINCT与UNION结合使用。对于不使用DISTINCT的性能可能更好。
有关UNION的更多信息,请访问:SQL UNION Operator
答案 4 :(得分:0)
错误消息位于“QueryBrowser.pas”中,是mysql-gui-tools的一部分。
procedure TQueryBrowserForm.SQLCreateViewClick(Sender: TObject);
// ...
begin
if Assigned(ActiveResultset) and (ActiveResultset.ResultSet.query.query_type = MYX_QT_SELECT)then
// ...
else
ShowError('Creation error', _('A view can only be created from a active resultset of SELECT command.'), []);
end;
由a)没有活动结果集和b)查询类型错误触发。
删除“DISTINCT”会有什么不同吗?无论如何,这是QueryBrowser中的一个错误,而不是一个MySQL。直接在MySQL中创建视图应该足以作为解决方法。