2016-12-06 32 views
0

我們有6個與樣品(例如)蜂巢表結構像 (其中每個表都有上百萬的商人記錄)蜂巢連接多個表以創建水平佈局

Table1 
MerchntId ,field1, field2 

Table2 
MerchantId, field3,field4 

Table3 
MerchantId, field5,field6,field7 

Table4 
MerchantId, field8,field9,field10 

Table5 
MerchantId, field11, field12, field13 

要求是創建水平佈局,以獲取至少一個字段對商戶有價值的所有獨特商家商戶可能會或可能不會出現在其他表中(對於商家,可能有其他表中的記錄或可能不是那裏)

決賽 MerchntId,FIELD1,FIELD2,字段3,字段4,
字段5,字段6,字段7,字段8,字段9,字段10,field11,field12,field13

輸出應該像接合後

i) 101 abc def       ghi 
ii) 102 ghj fert hyu ioj khhh jjh ddd aas fff kkk fff vvv ff 

對於情況(ⅰ)僅三個字段具有用於情況值 (ii)所有字段具有值

爲此,我們正在做的FULL OUTER上MERCHANTID JOIN的兩個表等,然後創建最終表

有沒有什麼更好的方法這樣做呢?

例如, 我目前的做法

SELECT distinct 
(case when a.MerchntId IS NOT NULL then a.MerchntId else (case when  
b.MerchntId IS NOT NULL 
then b.MerchntId else '' end) end) as MerchntId, 
(case when a.field1 IS NOT NULL then a.field1 else '' end) as field1, 
(case when a.field2 IS NOT NULL then a.field2 else '' end) as field2, 
(case when b.field3 IS NOT NULL then b.field3 else '' end) as field3, 
(case when b.field4 IS NOT NULL then b.field4 else '' end) as field4 
from Table1 a 
full outer join Table2 b 
ON a.MerchntId = c.MerchntId; 

完全外部聯接表3和表4 然後全外連接這兩個表中創建一個決賽桌

回答

0

我沒有看到任何其他的選擇,因爲你的要求明確地轉化爲完整的外連接。然而,你的查詢可以通過使用COALESCE and NVL加以改進:

SELECT 
COALESCE(a.MerchntId, b.MerchntId) as MerchntId, 
NVL(a.field1, '') as field1, 
NVL(a.field2, '') as field2, 
NVL(b.field3, '') as field3, 
NVL(b.field4, '') as field4 
from Table1 a 
full outer join Table2 b 
ON a.MerchntId = c.MerchntId; 

另外,我不知道爲什麼你在查詢中使用distinct

0

聯合所有6個表,用空值代替錯過的域。然後通過總使用MERCHANTID MIN或MAX:

select MerchantId, max(field1) field1, max(field2) field2...max(field13) field13 from 
(
select MerchntId field1, field2, null field3, null field4... null field13 from Table1 
union all 
select MerchntId null field1, null field2, field3, field4... null field13 from Table2 
union all 
... 

select MerchantId, null field1, null field2... field11, field12, field13 
from table6 
)s group by MerchantId 

在此之後,你可以在必要時

與「替換NULL」申請你的邏輯