我有一个这样结构的视图(org_view):
DEPARTMENT_NAME GUILD_NAME TRIBE_NAME
D1 G1 T1
D1 G1 T2
D1 G2 T3
D2 G3 T4
和映射表(table_for_mapping):
TRIBE_NAME SYSTEM
T1 S1
T4 S1
我想做的是创建一个新的视图,其中GUILD_NAME将被替换为系统,如果部落在映射表中被发现,如果不是公会名称将保留。
示例:new_view:
DEPARTMENT_NAME GUILD/SYSTEM TRIBE_NAME
D1 S1 T1
D1 G1 T2
D1 G2 T3
D2 S2 T4
我设法为这个创建一个视图:
SELECT org.DEPARTMENT_NAME,
if (org.TRIBE_NAME = map.TRIBE_NAME ,map.SYSTEM,org.GUILD_NAME) as "Guild/System",
org.TRIBE_NAME
from org_view org left join table_for_mapping map
on org.TRIBE_NAME = map.TRIBE_NAME
问题是当一个系统直接映射到一个公会下。一个公会下可以有多个部落,但是如果一个SYSTEM直接映射到公会下,那么所有的部落都应该映射到SYSTEM。
Ex : GUILD_NAME TRIBE_NAME
GUILD_EUROPE GUILD_EUROPE
GUILD_EUROPE TRIBE_WEST
GUILD_EUROPE TRIBE_NORTH
GUILD_EUROPE TRIBE_EAST
在本例中,如果SYSTEM映射到TRIBE_NAME = GUILD_EUROPE:
TRIBE_NAME SYSTEM
GUILD_EUROPE SYSTEM_1
然后在新视图中:
GUILD/SYSTEM TRIBE_NAME
SYSTEM_1 GUILD_EUROPE
SYSTEM_1 TRIBE_EAST
SYSTEM_1 TRIBE_WEST
SYSTEM_1 TRIBE_NORTH
我知道,如果在我创建的视图中需要删除这种情况下,但目前我没有找到任何解决方案,所以这就是为什么我寻求帮助。
谢谢!
据我所知,下面的代码可以解决您的问题
SELECT
org.DEPARTMENT_NAME ,
org.GUILD_NAME ,
coalesce(map2.`SYSTEM` , map.`SYSTEM` , org.GUILD_NAME ) "Guild/System"
from
org_view org
left join table_for_mapping map on
org.TRIBE_NAME = map.TRIBE_NAME
left join table_for_mapping map2 on
org.GUILD_NAME = map2.TRIBE_NAME
;
这个想法是左连接org_view
和table_for_mapping
两次,然后利用coalesce
函数来确定新列的值。
select org.DEPARTMENT_NAME, if (temp.SYSTEM is not null ,temp.SYSTEM,org.GUILD_NAME) as "Guild/System", org.TRIBE_NAME from org_view org left join (select org.GUILD_NAME,tfm.SYSTEM from org_view org inner join table_for_mapping tfm on org.TRIBE_NAME = tfm.TRIBE_NAME ) temp on temp.GUILD_NAME = org.GUILD_NAME order by org.DEPARTMENT_NAME ASC
查询上面
- Check SYSTEM直接映射到公会下。
- 如果找到匹配,应该映射到SYSTEM.