【问题标题】:SQL: Left Outer join that can switch what columns to join with depending on data inside the columnSQL:左外连接,可以根据列内的数据切换要连接的列
【发布时间】:2017-02-15 23:11:20
【问题描述】:

我正在尝试将这两个表连接在一起以显示基数中的记录和历史记录中的空值。我遇到的问题是左外连接。当 BO.val2 = 0 时:我希望连接仅使用 BO.VAL5 = TR.VAL5 但当 BO.val2 = TR.val2 我希望它使用它进行连接。下面的代码只是一个想法。如果您对如何执行此操作有任何建议,那就太好了!

 SELECT DISTINCT      
   BO.RUN_DATE,
   BO.val2,
   BO.val3,
   BO.val4,
   BO.VAL5
   TR.DTDATE,
   TR.val2,
   TR.val3,
   TR.val4,
   TR.val5
 FROM BASE BO                    
 LEFT OUTER JOIN HISTORY AS TR ON CASE 
   WHEN BO.val2 = 0 and  BO.VAL5 = TR.VAL5  THEN ????
   WHEN BO.val2 = TR.val2 and BO.VAL5 = TR.VAL5 then ???
   ELSE ??
   END 
 WHERE TRUNC(BO.POST_DATE)= TRUNC(SYSDATE)
 ORDER BY BO.VAL4  ;

【问题讨论】:

    标签: sql sql-server left-join outer-join sqlhelper


    【解决方案1】:

    您的两个变体都有BO.VAL5 = TR.VAL5 的共同点。

    第二部分逻辑是BO.val2 = TR.val2BO.val2 = 0

    所以,最终条件应该是:

    SELECT DISTINCT
        BO.RUN_DATE,
        BO.val2,
        BO.val3,
        BO.val4,
        BO.VAL5,
        TR.DTDATE,
        TR.val2,
        TR.val3,
        TR.val4,
        TR.val5
    FROM
        BASE AS BO
        LEFT JOIN HISTORY AS TR
            ON BO.VAL5 = TR.VAL5 AND (BO.val2 = 0 OR BO.val2 = TR.val2)
    WHERE
        TRUNC(BO.POST_DATE) = TRUNC(SYSDATE)
    ORDER BY BO.VAL4;
    

    【讨论】:

    • @BeauJenkins,欢迎来到 Stack Overflow。请注意,在这里说“谢谢”的首选方式是投票赞成好的问题和有用的答案(一旦你有足够的声誉这样做),并接受对你提出的任何问题最有帮助的答案(这也给出了你的声誉小幅提升)。请参阅About 页面和How do I ask questions here?
    【解决方案2】:

    您需要使用不同的条件加入两次历史记录。然后你可以使用 COALESCE() 来返回数据

      SELECT DISTINCT 
           BO.RUN_DATE,
           BO.val2,
           BO.val3,
           BO.val4,
           BO.VAL5
           COALESCE(TR.DTDATE, TR2.DTDATE) AS DTDATE,
           COALESCE(TR.val2, TR2.val2) AS val2,
           COALESCE(TR.val3, TR2.val3) AS val3,
           COALESCE(TR.val4, TR2.val4) AS val4,
           COALESCE(TR.val5, TR2.val5) AS val5
      FROM BASE BO                    
      LEFT OUTER JOIN History AS TR ON TR.VAL5 = BO.VAL5
      LEFT OUTER JOIN History AS TR2 ON TR2.VAL2 = BO.VAL2
      WHERE TRUNC(BO.POST_DATE)= TRUNC(SYSDATE)
      ORDER BY BO.VAL4 ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-02
      • 1970-01-01
      • 2019-06-12
      • 2021-09-02
      • 2017-10-01
      • 2015-01-11
      • 1970-01-01
      相关资源
      最近更新 更多