加入两张桌子

时间:2010-03-03 14:30:32

标签: sql

我有用户表。还有三个表:开发人员,经理,测试人员。所有这些表都有一个外键user_id。

我需要找到所有开发人员或经理用户。 sql会是什么样子?

更新:有人既可以是开发人员也可以是经理。

4 个答案:

答案 0 :(得分:7)

一种方法是

SELECT  u.*, 'Developer'
FROM    users u
        INNER JOIN developer d ON d.user_id = u.user_id
UNION ALL 
SELECT  u.*, 'Manager'
FROM    users u
        INNER JOIN manager m ON m.user_id = u.user_id

答案 1 :(得分:2)

SELECT  *
FROM    users u
WHERE   EXISTS
        (
        SELECT  NULL
        FROM    developers
        WHERE   user_id = u.id
        UNION ALL
        SELECT  NULL
        FROM    managers
        WHERE   user_id = u.id
        )

答案 2 :(得分:1)

SELECT    u.*, 
          CASE d.user_id IS NULL THEN 'N' ELSE 'Y' END is_developer,
          CASE m.user_id IS NULL THEN 'N' ELSE 'Y' END is_manager
FROM      users u                -- all users
LEFT JOIN developers d           -- perhaps a developer
ON        u.user_id = d.user_id
LEFT JOIN manager m              -- perhaps a manager
ON        u.user_id = m.user_id
WHERE     d.user_id IS NOT NULL  -- either a developer
   OR     m.user_id IS NOT NULL  -- or a manager (or both)

答案 3 :(得分:0)

SELECT
    user_id
     /* ...other desired columns from the user table... */
FROM
    user
WHERE
    user_id IN (SELECT user_id FROM developer UNION SELECT user_id FROM manager)

这里我使用IN而不是EXISTS,因此只需要查询一次开发人员和经理表。无论如何,优化器可能会这样做,但这使得它显而易见。

此外,此解决方案不会为管理员和开发人员的用户返回重复项。