【问题标题】:Applying OUTER JOIN in Oracle在 Oracle 中应用 OUTER JOIN
【发布时间】:2019-07-29 01:45:15
【问题描述】:

创建 3 个表后,equip_type、output_history 和 time_history。 此代码用于为每一行 output_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

但是我如何修改代码以显示没有equip_type的行,像这样。

EQUIP MODEL DATE1  QUANTITY   DATE2   TIME  EQUIP_TYPE
 ---- ---- ---------- ------  -------- ----  ----------
  e1    m1  20180103  10      20180101   6    A
  e1    m1  20180106  20      20180105   5    A
  e2    m1  20180106  20      20180105   5   (null)
  e3    m1  20180106  20      (null)  (null) (null) 

代码如下;

 CREATE TABLE equip_type  (  
      EQUIP_TYPE VARCHAR(15),    
      EQUIP VARCHAR(15)
      );
    INSERT INTO equip_type  VALUES ('A','e1');
    CREATE TABLE output_history (  
      EQUIP VARCHAR(15),     
      MODEL VARCHAR(15),     
      Data1 VARCHAR(15),        
      QUANTITY  NUMBER(10) 
      );
    INSERT INTO output_history VALUES ('e1','m1','20180103',10);
    INSERT INTO output_history VALUES ('e1','m1','20180106',20);
    INSERT INTO output_history VALUES ('e2','m1','20180106',20);
    INSERT INTO output_history VALUES ('e3','m1','20180106',20);
    CREATE TABLE time_history (  
      EQUIP VARCHAR(15),     
      MODEL VARCHAR(15),       
      Data2 VARCHAR(15),    
      time NUMBER(10)
      );
    INSERT INTO time_history VALUES ('e1','m1','20180101',6);
    INSERT INTO time_history VALUES ('e1','m1','20180105',5);
    INSERT INTO time_history VALUES ('e2','m1','20180106',5); --added

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    --I have tried RIGHT OUTER JOIN here, but didn' work
    INNER JOIN time_history t ON t.equip = o.equip AND t.data2 <= o.data1
    AND t.data2 >= '20180101' 
WHERE NOT EXISTS (
    SELECT 1 
    FROM time_history
    WHERE 
        equip = o.equip
        AND data2 <= o.data1
        AND data2 > t.data2
        AND data2 >= '20180101' AND data2 <= '2080106' 
)AND o.data1 >= '20180101' AND o.data1 <= '20180106';

【问题讨论】:

  • 您是否尝试过在“INNER JOINequip_type e ON e.equip = o.equip”上使用 LEFT JOIN
  • time_history 中没有 e2,所以不清楚为什么你会期望 date2 是 20180105 for e2
  • @Peter Paff 我刚刚添加了我省略的一行

标签: oracle outer-join


【解决方案1】:
SELECT
    o.equip,
    o.model,
    o.data1,
    o.quantity,
    t.data2,
    t.time,
    e.equip_type
FROM 
    output_history o
    LEFT JOIN equip_type e ON e.equip = o.equip    
    LEFT JOIN time_history t ON t.equip = o.equip AND t.data2 <= o.data1
    AND t.data2 >= '20180101' 
WHERE NOT EXISTS (
    SELECT 1 
    FROM time_history
    WHERE 
        equip = o.equip
        AND data2 <= o.data1
        AND data2 > t.data2
        AND data2 >= '20180101' AND data2 <= '2080106' 
)AND o.data1 >= '20180101' AND o.data1 <= '20180106' ORDER BY equip, quantity;

【讨论】:

    【解决方案2】:

    这实际上是你需要的双重输出,设备和时间历史都缺少装备“e2”记录。

    但这应该可行。 (注意特殊的 oracle 外连接语法)

    SELECT
        o.equip,
        o.model,
        o.data1,
        o.quantity,
        t.data2,
        t.time,
        e.equip_type
    FROM 
        output_history o, equip_type e, time_history t 
    WHERE 
        o.equip = e.equip (+)
        AND o.equip = t.equip
        AND o.model = t.model
        AND t.data2 = (select max(data2) from time_history where equip = o.equip and model = o.model and data2 < o.data1)
    UNION        
    SELECT
        o.equip,
        o.model,
        o.data1,
        o.quantity,
        null,
        null,
        e.equip_type
    FROM 
        output_history o, equip_type e
    WHERE 
        o.equip = e.equip (+)
        AND NOT exists (select 1 from time_history where equip = o.equip and model = o.model)
    ; 
    

    还要注意

    AND t.data2 = (select max(data2) from time_history where equip = o.equip and model = o.model and data2 < o.data1)
    

    当您想要加入最近但以前的记录时,这是一种通用方法。但是在外部连接中是不可能的。这就是为什么需要 UNION 之后的部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-10
      • 1970-01-01
      • 2018-01-13
      • 1970-01-01
      • 2015-07-08
      • 1970-01-01
      相关资源
      最近更新 更多