2012-03-05 123 views
1

我想使用JOIN语法来判断如何返回一个包含关联值的行,首先应该检查links表,看它是否为NULL,如果它不是NULL将其用于JOIN例如如果该行是NULl,则为ON links.role_id = roles.role_id。如果它是NULL,则使用people表。选择列,如果不是NULL,然后选择其他

我的语法:

SELECT roles.role_name 
FROM 
(
    people_links links 

    LEFT OUTER JOIN people people ON links.person_id = people.person_id 

    LEFT OUTER JOIN roles roles ON links.role_id = roles.role_id OR links.role_id = people.role_id 
) 

基本连接和使用ON语法与role_id时,它将返回从从role_id使用,因此它应该依靠linksroles表中的相关值首先,检查links.role_id是否为NULL然后返回people.role_id否则links.role_idJOIN得到role_name

当我运行此查询时,它首先使用people表中的role_id,此时应首先查看links表。

我试着用COALESCE,但将只返回role_id时,它应该返回role_name,因此,例如(伪代码):

SELECT IF(links.role_id IS NOT NULL) links.role_id ELSE people.role_id ENDIF as join_value 
FROM 
(
    people_links links 

    LEFT OUTER JOIN people people ON links.person_id = people.person_id 

    LEFT OUTER JOIN roles roles ON roles.role_id = join_value 
) 
+0

其实,尽管我的回答如下 - 我现在认为我不明白你想做什么。你能否展示一些样本数据和预期的结果? – ruakh 2012-03-05 14:41:35

回答

0

我想代码清晰,我会有两个角色加入。一个来自角色的联系,另一个来自角色的角色。即

SELECT 
COALESCE(links_roles.role_name, people_roles.role_name) 
FROM 
(
    people_links links 

    LEFT OUTER JOIN people people ON links.person_id = people.person_id 

    LEFT OUTER JOIN roles link_roles ON links.role_id = link_roles.role_id 

    LEFT OUTER JOIN roles people_roles ON people.role_id = people_roles.role_id 
)