2010-03-03 8 views
3

사용자 테이블이 있습니다. 세 가지 테이블이 있습니다 : 개발자, 관리자, 테스터. 이 테이블에는 모두 외래 키 user_id가 있습니다.두 테이블을 결합하십시오.

개발자 또는 관리자 인 모든 사용자를 찾아야합니다. SQL은 어떻게 생겼을까요?

업데이트 : 누군가 개발자와 관리자가 될 수 있습니다. 그것을 할 수

+0

당신은 정규화를 통해-데이터가 될 수 있다는 생각 해 봤나? – Timothy

+0

누군가가 개발자, 관리자 또는 둘 다일 때 출력으로 기대하는 것은 무엇입니까? 그냥 user_id? 하나의 기록에서 그의 기능? 두 기록? –

+0

@Lieven 그냥 user_id –

답변

7

한 가지 방법은 개발자와 관리자 테이블이 하나의 시간을 조회 할 필요가 있도록 내가 IN 사용하는 대신 EXISTS하고 여기에

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 
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) 

될 것이다. 어쨌든 옵티마이 저가이를 수행 할 수는 있지만 이는이를 명시 적으로 만듭니다.

또한이 솔루션은 관리자와 개발자 모두에게 중복을 반환하지 않습니다.

+0

이 경우 UNION ALL을 사용합니다 ... UNION –

+0

@Roland로 인해 부질의 결과를 불필요하게 중복 제거하는 중입니다. 엔진이 자동으로 처리합니다. 'MySQL'조차도 'IN'술어에서 'DISTINCT'를 무시할만큼 똑똑합니다. – Quassnoi

+0

@Roland Bouman -이 재귀 UNION ALL이 어디서 왔는지 궁금합니다. 그래서 그것은 성능입니다. UNION 문은 기능이 실제로 관계형 데이터베이스 이론과 일치하는 모든 SQL 언어에서 한 곳이기 때문에 전환하지 않을 것이라고 생각합니다! –

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 
     ) 
+0

Quassnoi - 좋다! 하지만 오타가 있습니다 - 사용자는 별칭이 필요합니다. –

+0

@Roland : SO에 내장 쿼리 파서가 필요합니다! – Quassnoi

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) 
관련 문제