12

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

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 命令的活动结果集中创建视图

有人可以帮我吗?

4

5 回答 5

13
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

我试过了,它奏效了!感谢大家 :)

于 2009-02-05T09:34:18.467 回答
4

您可能希望在第二个选择中切换用户 ID 和位置的顺序。在联合的所有选择中,列名应匹配 1 到 1。

编辑:对于查询浏览器,正如指出“要从查询创建视图,您必须已成功执行查询。更准确地说,视图是从最新成功执行的查询创建的,不一定是从当前的查询查询区"

所以您需要先执行查询,然后再在查询浏览器中创建视图。

错误来自查询浏览器而不是 mysql。

于 2009-02-05T06:38:43.520 回答
1

您将不同的类型合并到同一列中。(名称可以不同,但​​类型必须相同,或者至少可以自动转换。)但正如@Learning 指出的那样,看起来你已经扭曲了 SELECT 列枚举。

以防万一,正确的语法(对我有用)是

CREATE VIEW myView 
AS  
SELECT ... 
于 2009-02-05T06:42:46.803 回答
1

关于UNION的一点评论。UNION 仅返回结果集的不同值。所以没有必要将 SELECT DISTINCT 与 UNION 结合使用。不使用 DISTINCT 可能会更好地提高性能。

关于 UNION 的更多信息可以在这里找到:SQL UNION Operator

于 2009-02-05T11:24:59.883 回答
0

错误消息在mysql-gui-tools 的一部分“QueryBrowser.pas”中。

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 中创建视图应该足以解决问题。

于 2009-02-05T08:57:55.733 回答