【问题标题】:Join Two tables but replace overlapping data with second tables连接两个表,但用第二个表替换重叠数据
【发布时间】:2021-10-26 18:17:24
【问题描述】:

您好,我正在处理一个理论问题。假设我有这两个表

订单表

Entry Order# DatePlaced Type
2001 5 2021-05-03 C

状态表

Entry Order# Status Date Deleted
2001 5 S 2021-05-04 0
2002 5 D 2021-05-05 0

所以我需要能够得到这个

预期表

Entry Order# DatePlaced Type Status Date Deleted
2002 5 2021-05-03 C D 2021-05-05 0

如果我可以离开加入数据,这将相当容易。问题是代码中的sql已经这样写了。这些表是根据条目连接的。每次订单出现新状态时,订单表中的条目都会更新,但交付时除外。对于代码的依赖程度,我不能简单地更新下面的初始查询。我想知道是否有一个不使用 SET 的连接或方式,我可以根据订单获得最后一个状态?我在想我们可以检查订单,然后检查条目,但我不确定如何将其与当前表(我们从查询中获得的数据)连接起来

SELECT * FROM orders or 
LEFT JOIN status st ON or.entry = st.entry
WHERE st.deleted = 0;

这会导致这个

当前表

Entry Order# DatePlaced Type Status Date Deleted
2001 5 2021-05-03 C S 2021-05-04 0

有没有办法将状态表与当前表连接起来,以便状态列成为我所期望的?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    这会很好用:

    SELECT s.entry, s.order_no, o.date_placed, o.type, s.status, s.date, s.deleted 
    FROM `orders` o
    INNER JOIN `status` s ON (
        s.order_no=o.order_no AND s.entry=(SELECT MAX(entry) FROM status WHERE order_no = o.order_no)
    )
    

    现场演示

    https://www.db-fiddle.com/f/twz1TT9VH7YNTY1KrpRAjx/3

    【讨论】:

      【解决方案2】:

      最后一个状态是否有更高的条目号或更高的创建日期?

      也许在您的SELECT 子句中包含MAX(st.Entry) as last_entry

      也许明确选择您的字段 与选择 *

      并包含一个

      GROUP BY 
      

      在您的 WHERE 子句之后 还有一个

       HAVING 
      

      在你的GROUP BY之后

      create table orders  ( 
      entry INT, 
      order_number INT, 
      date_placed date, 
      order_type  VARCHAR(1) )
      
      create table order_status  (
      entry INT,
      order_number INT,
      order_status VARCHAR(1),
      date_created date,
      deleted INT
      );
      
      INSERT INTO orders (entry, order_number, date_placed, order_type) VALUES (2001, 5, '2021-05-03', 'C');
      
      INSERT INTO order_status (entry, order_number, order_status, date_created, deleted) 
      VALUES 
      (2001, 5, 'S', '2001-05-04', 0),
      (2002, 5, 'D', '2001-05-05', 0);
      
      SELECT os.entry, o.order_number, o.date_placed, o.order_type, 
             os.order_status, os.date_created, os.deleted, 
             MAX(os.entry) as last_entry
        FROM orders o
        LEFT JOIN order_status os
          ON o.order_number = os.order_number
       GROUP BY o.order_number
      HAVING os.entry = last_entry
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-05
        • 2021-09-30
        • 1970-01-01
        • 1970-01-01
        • 2021-11-11
        • 2021-08-23
        • 1970-01-01
        相关资源
        最近更新 更多