SQL:根据列内数据切换所要连接的列的左外连接

3

我正在尝试将这两个表连接起来,以显示基础记录和历史中的空值。 我遇到的问题是左外连接。 当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  ;
2个回答

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。 请注意,在这里表达“感谢”的首选方式是通过给好问题和有帮助的答案投票(一旦您有足够的声望),并接受对您提出的任何问题最有帮助的答案(这也会为您的声望提供小小的提升)。 请参阅[关于]页面以及我如何在这里提问? - Vladimir Baranov

0
你需要做的是两次连接到历史记录,使用不同的条件。然后你可以使用 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 ;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接