2014-02-17 64 views
0

我有三個表USERSCOMPANIESORGANIZATIONS根據列在一個表中的值獲得來自兩個不同的表

USERS包含數據:USER_ID,USER_OWNER_ID,OWNER_TYPE,USER_NAME

COMPANIES包含:COMPANY_ID ,COMPANY_NAME

ORGANIZATIONS包含:的organization_ID,ORGANIZATION_NAME

我的要求是的,我必須得到COMPANIES.COMPANY_NAME如果USERS.OWNER_TYPE是20和應該得到的ORGANIZATIONS.ORGANIZATION_NAME如果USERS.OWNER_TYPE是30

所以,我用下面的查詢這裏

SELECT US.USER_NAME, 
     US.USER_OWNER_ID, 
     IF ( 
      US.OWNER_TYPE=20, ORG.ORGANIZATION_NAME, CO.COMPANY_NAME 
      ) AS NAME 
    FROM USERS US, 
     COMPANIES CO, 
     ORGANIZATIONS ORG 
WHERE (US.OWNER_TYPE=20 AND US.USER_OWNER_ID=ORG.ORGANIZATION_ID) 
     OR 
     (US.OWNER_TYPE=30 AND US.USER_OWNER_ID=CO.COMPANY_ID) 

問題是,我得到重複OWNER_TYPE = 30的記錄來自OWNERS表。

有人可以幫我看看這個查詢嗎?

回答

1

您可以嘗試

SELECT us.user_name, 
     us.user_owner_id, 
     COALESCE(co.company_name, org.organization_name) AS name 
FROM users us LEFT JOIN companies co 
    ON us.user_owner_id = co.company_id 
    AND us.owner_type = 30 LEFT JOIN organizations org 
    ON us.user_owner_id = org.organization_id 
    AND us.owner_type = 20 

輸出示例:

 
| USER_NAME | USER_OWNER_ID |   NAME | 
|-----------|---------------|---------------| 
|  User1 |    1 | Organization1 | 
|  User2 |    1 |  Company1 | 

這裏是SQLFiddle演示

+0

** Downvoter **您是否在意解釋投票的結果? – peterm

+0

這對我來說工作得很好......謝謝.. – user3066006

-1

我認爲這將是快速,

SELECT us.* 
    FROM users us 
     INNER JOIN COMPANIES co 
        ON US.OWNER_TYPE=30 
        AND US.USER_OWNER_ID=CO.COMPANY_ID 
UNION ALL 
SELECT us.* 
    FROM users us 
     INNER JOIN ORGANIZATIONS org (
     US.OWNER_TYPE=20 
     AND US.USER_OWNER_ID=ORG.ORGANIZATION_ID 
     ) 
+0

真的很快。但有語法錯誤。雖然我沒有倒下 – Alexander

相關問題