Получение первого в зависимости от текущей строки - PullRequest
0 голосов
/ 06 января 2019

В базе данных Oracle есть три таблицы, такие как equip_type, output_history и time_history. Как объединить три таблицы, как показано ниже? (СУБД: 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 голосов
/ 06 января 2019

Вы можете использовать коррелированный подзапрос с условием NOT EXIST, чтобы выбрать ближайшую связанную запись в time_history.

Я проверил приведенный ниже запрос на MySQL в этой скрипте БД . Вы не пометили СУБД, которую используете. Я тестировал на MySQL, но это стандартный 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. В вашем случае использования это работает только потому, что даты отформатированы таким образом, что их легко сортировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...