首页 > 解决方案 > 根据当前行获取第一个

问题描述

在 Oracle DB 中有三个表,例如equip_typeoutput_history和。time_history如下图三张表如何连接?(数据库管理系统:甲骨文)

 EQUIP MODEL DATE1  QUANTITY   DATE2   TIME  EQUIP_TYPE
 ---- ---- ---------- ------  -------- ----  ----------
  e1    m1  20180103  10      20180101   6    A
  e1    m1  20180106  20      20180105   5    A

请注意,在 in 点DATE1 '20180103'output_historyinDATE2 '20180101'time_history最新的。

在 in 点DATE1 '20180106'output_historyin'DATE2 20180105'time_history最新的。

--equip_type table and the date
CREATE TABLE equip_type  (  
  EQUIP_TYPE VARCHAR(60),    
  EQUIP VARCHAR(60)
  );
INSERT INTO equip_type  VALUES ('A','e1');

-- output_history and data
CREATE TABLE output_history (  
  EQUIP VARCHAR(60),     
  MODEL VARCHAR(60),     
  Data1 VARCHAR(60),        
  QUANTITY  NUMBER(10) 
  );
INSERT INTO output_history VALUES ('e1','m1','20180103',10);
INSERT INTO output_history VALUES ('e1','m1','20180106',20);


--time_history table and data
CREATE TABLE time_history (  
  EQUIP VARCHAR(60),     
  MODEL VARCHAR(60),       
  Data2 VARCHAR(60),    
  time NUMBER(10)
  );
INSERT INTO time_history VALUES ('e1','m1','20180101',6);
INSERT INTO time_history VALUES ('e1','m1','20180105',5);

标签: sqloraclejoin

解决方案


您可以使用带有NOT EXIST条件的相关子查询来选择 中最接近的相关记录time_history

我在这个 db fiddle中测试了下面关于 MySQL 的查询。您没有标记您正在使用的 RDBMS。我在 MySQL 上进行了测试,但这是适用于大多数 RDBMS 的标准 SQL。

SELECT
    o.equip,
    o.model,
    o.data1,
    o.quantity,
    t.data2,
    t.time,
    e.equip_type
FROM 
    output_history o
    INNER JOIN equip_type e ON e.equip = o.equip
    INNER JOIN time_history t ON t.equip = o.equip AND t.data2 <= o.data1
WHERE NOT EXISTS (
    SELECT 1 
    FROM time_history
    WHERE 
        equip = o.equip
        AND data2 <= o.data1
        AND data2 > t.data2
)

sid notes : 查询总是在当前time_history记录之前output_history查找最近的记录(即使以后有最近的记录也不会被选中)

免责声明:不要将日期存储为字符串,这是灾难的根源。根据您的 RDBMS 使用相关数据类型。在您的用例中,它之所以有效,只是因为日期的格式易于排序。


推荐阅读