Oracle DB中有三个表,例如equip_type
,output_history
和time_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);
答案 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使用相关的数据类型。在您的用例中,它之所以起作用,是因为日期的格式设置很容易将其排序。