首页 > 解决方案 > 将两个视图合二为一?

问题描述

大家下午好

我是 mySQL 的新手。我的一切都按我的意愿工作,但我只能通过创建第一个视图,然后在最终视图中引用它来实现我想要的。我想知道这是否是不好的做法,是否会导致性能下降?而且,只是为了学习是否可以通过使用单个视图来完成。我已经尝试过,但不断收到错误。

首先我创建了这个视图,我称之为中间视图:

  CREATE VIEW intermediate_view AS (
  SELECT 
    freight,
    shipping_date,
    receiver,
    tracking_no,
    left(cast(receiver as int), 3) as vendor_id,
    DATEDIFF(now(),shipping_date) AS days_in_transit,
    CASE 
    WHEN DATEDIFF(now(),shipping_date) > 5 then "Problem"
    WHEN DATEDIFF(now(),shipping_date) < 0 then "Not shipped yet"
    ELSE "In transit" 
    END
    AS Status
  FROM tracking
);

然后,我将创建一个最终视图,以将另一个表中的数据加入其中。我的第二种观点是

CREATE VIEW final_view AS (
SELECT
    intermediate_view.freight,
    intermediate_view.shipping_date,
    intermediate_view.receiver,
    intermediate_view.tracking_no,
    intermediate_view.days_in_transit,
    intermediate_view.Status,
    vendors.vendor_name
    FROM intermediate_view
    JOIN vendors
    on intermediate_view.vendor_id = vendors.vendor_id
);

基本上,第二个表所做的只是将 left(cast(receiver as int), 3) 的前 3 个数字与另一个表匹配,其中这 3 个数字具有相应的公司名称。有没有办法在一个视图中加入这个?

希望我已经解释得足够好!提前致谢

标签: mysql

解决方案


你的演员在 MySQL 中不起作用,所以使用这个

CREATE VIEW final_view AS (
SELECT 
    t.freight,
    t.shipping_date,
    t.receiver,
    t.tracking_no,
    left(cast(t.`receiver` as UNSIGNED), 3) as vendor_id,
    DATEDIFF(now(),t.shipping_date) AS days_in_transit,
    CASE 
    WHEN DATEDIFF(now(),t.shipping_date) > 5 then "Problem"
    WHEN DATEDIFF(now(),t.shipping_date) < 0 then "Not shipped yet"
    ELSE "In transit" 
    END
    AS 'Status',
    v.vendor_name
  FROM tracking t JOIN
  vendors v
    on left(cast(t.`receiver` as UNSIGNED), 3) = v.vendor_id
);

推荐阅读