INNER JOIN基于另一个字段AS400

时间:2016-12-27 10:01:22

标签: sql db2 ibm-midrange

我正在维护一个旧系统,其中未正确创建表的结构和设计。我知道这是一个丑陋的"情况,但我需要处理它。

我有一个包含多个字段的表TABLEA。其中两个代表MODEL(MODEL1和MODEL2)。根据状态(STATUS),MODEL1和MODEL2具有以下值:

  1. 状态=" A"那么MODEL1 ="模型" AND MODEL2 =""
  2. 状态<> " A"那么MODEL1 ="" AND MODEL2 ="模型"
  3. 我需要执行一个查询,我将TABLEA与模型上的另一个表TABLEB连接起来。根据状态,我需要使用非空模型字段连接表。

    我可以通过连接MODEL1和MODEL2解决它:

    SELECT * 
    FROM TABLEA A INNER JOIN TABLEB B
    ON (A.MODEL1 || A.MODEL2) = B.MODEL;
    

    但我想知道是否有一种优雅的方式来使用IF条件。 欢迎任何其他解决方案。

    更新 - 示例数据 enter image description here

2 个答案:

答案 0 :(得分:1)

你可以像这样使用union:

select * 
  from tablea a
    inner join tableb b
      on a.model1 = b.model and a.status = 'A'
union all
select * 
  from tablea a
    inner join tableb b
      on a.model2 = b.model and a.status <> 'A'

答案 1 :(得分:0)

我更喜欢jmarkmurphy的解决方案,但这是另一种选择,使用左连接。

SELECT CASE WHEN b1.col1 = '' THEN b2.col1 ELSE b1.col1 END ......
FROM tablea a
LEFT JOIN tableb b1
ON a.model1 = b1.model
LEFT JOIN tableb b2
ON a.model2 = b2.model

但是,如果可能的话,架构中的变化是最佳选择:

  • 添加一个新的a.model列,其中包含model1和model2的所有非空值,并加入其中。

  • 使用物化视图,如:

    选择a。*,例如a.model1 =&#39;&#39;那么a.model2 ELSE a.model1 END AS模型

    FROM tablea a

  • 如果a.model1或a.model2上没有可以提高查询性能的索引,则可以将上一个视图用作非物质化的,可能是内联的视图。