根据当前行获取第一个

时间:2019-01-06 01:45:46

标签: sql oracle join

Oracle DB中有三个表,例如equip_typeoutput_historytime_history。如下图所示如何连接三个表? (DBMS:Oracle)

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

请注意,在DATE1'20180103' output_history的点,DATE2中的'20180101' time_history是最新的。

DATE1中的'20180106' output_history处,'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);

1 个答案:

答案 0 :(得分:1)

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

我在this 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注释:查询将始终在当前time_history记录之前 之前查找最近的output_history记录(即使将来有最接近的记录,将不会被选中)

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