用于在表之间映射的SQL查询

时间:2015-12-23 16:20:09

标签: sql oracle

我有一个包含以下列的表:

abc

table | current_core | Desc           | target_Core | Desc
------------------------------------------------------------------------
POS   | AM           | Assistant mgr  | ASmgr       | Assistent Manager
LOC   | 1            | NEW DELHI      | NEWDEL      | NEW DELHI
GRADE | CLASS-1      | Officer        | Ofcr        | Officer

现在我有一个包含以下代码的表格: 例如:

consolidated_table

position_code | location_code | start_date  | end_date    | person_no 
AM            | 10            | 01-jan-2010 | 01-jan-2018 | A1
AM            | 1             | 01-jan-2010 | 01-jan-2018 | A2   

现在我想编写一个查询,以便从start_date中选择end_dateperson_no consolidated_table等所有行,但position_code和{{{ 1}}来自location_code的{​​{1}}与target_core相对应,abc等于current_core中给出的代码。

我写了一个类似的查询:

consolidated_table

但是这个查询占用的行数较少。对于SELECT position_map.target_core position_code, location_map.target_code location_code stag.start date, stag.end_date, stag.person_no FROM consolidated_table stag, abc position_map, abc location_map WHERE position_map.current_core = position_map.position_code AND position_map.table = 'POS' AND location_map.current_code = location_map.location_code AND position_map.table = 'LOC' 中的location_code 10,consolidated_table中没有数据。我想在这种情况下只检索位置代码。

2 个答案:

答案 0 :(得分:0)

尝试下面的内容,除了一些列名不正确外,在发布的原始查询中还有一些其他语法错误。

SELECT
 position_map.target_core position_code,
 location_map.target_core location_code,
 stag.start_date,
 stag.end_date,
 stag.person_no 
FROM consolidated_table stag
LEFT JOIN abc position_map
 ON stag.position_code = position_map.current_core
 AND position_map.table = 'POS'
LEFT JOIN abc location_map
 ON  stag.location_code = location_map.current_core
 AND position_map.table = 'LOC'

答案 1 :(得分:0)

您的起始查询中的这两个条件是错误的:

position_map.current_core = position_map.position_code
location_map.current_code = location_map.location_code

position_maplocation_map别名是指表abc,它既没有position_code也没有location_code,也没有current_code。我想你打算将这些作为加入abcconsolidated_table(两次)的谓词。下面介绍了一种可能性,但如果确实如此,那么表abc的设计存在严重缺陷。

你也说......

  

对于consolidated_table中的location_code 10,abc中没有数据。我想在这种情况下只检索位置代码。

...我猜你的意思是你想要为consolidated_tableabc中与位置标准匹配的每个行组合至少包含一行,即使来自{ {1}}匹配位置标准。这将涉及外部联接。

把它放在一起,似乎你想要这些东西:

abc

不要忽略选择列表中的select pos.target_core as position_code, coalesce(loc.target_core, c.location_code) as location_code, c.start_date, c.end_date, c.person_no from consolidated_table c join abc as pos on pos.current_core = c.position_code left join abc as loc on loc.target_core = c.location_code and loc.table = 'LOC' where pos.table = 'POS' ,并将coalesce()条件作为连接谓词的一部分而不是过滤谓词中包含。前者说明了在位置标准不匹配的情况下,从表loc.table中提取的所有结果列都将为loc。后者反映了我对你想要做的连接的理解 - 外连接比连接谓词或过滤谓词中表达条件的内部连接更敏感。