2016-02-19 55 views
1

翻译值我有一个位置表SQL查询以检索输出

pos_table

position_code job_code location_code pos_name    BUSINESS_UNIT 

1    staff  delhi   supervisor    XYZ 
2   supervor manila   technical associate  ABC 

mapping table 


table_code source_code business_unit target_code 

LOC   DELHI   XYZ    10 
loc   MANILA   ABC    20 

job   staff   XYZ    01 
job   supervisor ABC    02 

我想它连接映射表,pos_table查询列,使得

为JOB_CODE人员映射表target_code的输出01应该来自 ,使用business_unit和source_code作为连接。

输出:

position_code job_code location_code pos_name    BUSINESS_UNIT 

1    01   10   supervisor    XYZ 
2    02   20   technical associate  ABC 

为了这个,我写的查询:

select POSITION_CODE, 
coalesce(JOB_MAP.FUSION_HARMONIZED_CODE,JOB_CODE) JOB_CODE, 
    coalesce(LOC_MAP.FUSION_HARMONIZED_CODE,LOCATION_CODE)LOCATION_CODE 
from pos_tab POS_STAG, 
    MAPPING_TAB LOC_MAP, 
    mapping_tab job_MAP 
where 1=1 
and JOB_MAP.source_code||business_unit_name = POS_STAG.JOB_CODE||business_unit_name 
and LOC_MAP.TABLE_CODE ='LOC' 
and job_map.table_code='JOB' 
and LOC_MAP.source_code ||business_unit_name = POS_STAG.LOCATION_CODE||business_unit_name; 

,但是这是行不通的,它是rerieving更多的行数

+0

您显示的数据看起来很不一致;混合大小写映射表的table_code中,pos表的作业代码有'supervor'而不是'supervisor'。这是你的实际数据,还是你为这个问题做好了准备? –

+0

@ AlexPoole-这是一个示例数据..请原谅打字错误 –

+0

随着清理值您的查询获得两行,所以它真的不清楚是什么问题。请输入一些实际证明问题的实际数据,并显示您现在得到的结果以及您想要获取的数据。 –

回答

1

我不知道是什么“SOURCE_CORE_HR_CODE”是因为你没有在你的问题中解释它,但我猜以下是正确的。


问题是你使用两个不同的连接你的映射表,所以你必须加入它两次。

我使用了作为标准存在超过20年的“新”加入语法。我建议你使用这种语法。这是很多更容易理解SQL如何使用此语法工作。我不知道为什么有人会用旧的风格。

SELECT P.POSITION_CODE, M1.TARGET_CODE AS JOB_CODE, M2.TARGET_CODE AS LOCATION_CODE, P.JOB_CODE AS POS_NAME, P.BUSINESS_UNIT 
FROM POS_TABLE P 
JOIN MAPPING_TABLE M1 ON P.JOB_CODE = M1.SOURCE_CODE AND upper(M1.TABLE_CODE) = 'JOB' 
JOIN MAPPING_TABLE M2 ON P.BUSINESS_UNIT = M2.BUSINESS_UNIT AND upper(M2.TABLE_CODE) = 'LOC' 
+0

@ hogan-同样的问题..很多行从aboev查询 –

+0

回想你有多少期望 - 为什么这么多? – Hogan

+0

我试过使用这个@Hogan,但现在它的行数减少了......我试图找出原因。将更新你 –