2016-12-27 125 views
1

我正在維護一箇舊系統,其中表的結構和設計未正確創建。我知道這是一個「醜陋」的情況,但我需要處理它。基於其他字段的INNER JOIN AS400

我有一個表TABLEA包含多個字段。其中兩個代表MODEL(MODEL1和MODEL2)。基於狀態(STATUS),MODEL1和MODEL2具有下列值:

  1. STATUS = 「A」 THEN MODEL1 = 「模型」 AND MODEL2 = 「」
  2. STATUS <> 「A」 THEN MODEL1 = 「」AND MODEL2 =「模型」

我需要執行一個查詢,我將TABLEA與模型上的另一個表TABLEB連接在一起。根據狀態,我需要加入非空模型字段的表格。

我可以通過連接MODEL1和MODEL2解決它:

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

但我不知道是否有一種優雅的方式使用IF條件去做。 歡迎任何其他解決方案。

更新 - 樣本數據 enter image description here

+0

請顯示樣本表數據。 –

+0

@TimBiegeleisen,請參閱我的更新 – ehh

回答

1

你可以使用UNION ALL這樣的:

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' 
+0

我非常喜歡這個解決方案,但我沒有太多看到檢查狀態的必要性,因爲它是空的或不空的。如果沒有匹配的空值,顯然不需要。如果可能的話,那麼檢查狀態= A可能表現更好,但將容器變成空值 – Juan

+0

對不起,我在說,將空容器變成零位可能會比狀態更好地執行「A」 – Juan

+0

隨着時間的推移,狀態變化可能會離開孤立的模型在任何模型領域。檢查狀態將防止這些孤兒造成問題。或者,用戶可以通過在狀態更改時清空適當的模型字段來以編程方式確保數據完整性。 – jmarkmurphy

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柱與兩個模型1和模型2的所有非空值,並加入就可以了。

  • 使用像物化視圖:

    SELECT的a *,CASE WHEN a.model1 = '' THEN ELSE a.model2 END a.model1 AS模型

    FROM tableA的

  • 如果在a.model1或a.model2上沒有可以提高查詢性能的索引,則可以將以前的視圖用作非物化視圖(可能爲內聯視圖)。