使用UNION创建MySQL视图

时间:2009-02-05 06:34:28

标签: sql mysql union

我正在尝试为以下查询创建一个视图。

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命令的活动结果集

创建视图

有人可以帮帮我吗?

5 个答案:

答案 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中创建视图应该足以作为解决方法。