我有一个包含以下列的表:
表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_date
,person_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
中没有数据。我想在这种情况下只检索位置代码。
答案 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_map
和location_map
别名是指表abc,它既没有position_code
也没有location_code
,也没有current_code
。我想你打算将这些作为加入abc
到consolidated_table
(两次)的谓词。下面介绍了一种可能性,但如果确实如此,那么表abc
的设计存在严重缺陷。
你也说......
对于consolidated_table中的location_code 10,abc中没有数据。我想在这种情况下只检索位置代码。
...我猜你的意思是你想要为consolidated_table
和abc
中与位置标准匹配的每个行组合至少包含一行,即使来自{ {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
。后者反映了我对你想要做的连接的理解 - 外连接比连接谓词或过滤谓词中表达条件的内部连接更敏感。