사용자 테이블이 있습니다. 세 가지 테이블이 있습니다 : 개발자, 관리자, 테스터. 이 테이블에는 모두 외래 키 user_id가 있습니다.두 테이블을 결합하십시오.
개발자 또는 관리자 인 모든 사용자를 찾아야합니다. SQL은 어떻게 생겼을까요?
업데이트 : 누군가 개발자와 관리자가 될 수 있습니다. 그것을 할 수
사용자 테이블이 있습니다. 세 가지 테이블이 있습니다 : 개발자, 관리자, 테스터. 이 테이블에는 모두 외래 키 user_id가 있습니다.두 테이블을 결합하십시오.
개발자 또는 관리자 인 모든 사용자를 찾아야합니다. SQL은 어떻게 생겼을까요?
업데이트 : 누군가 개발자와 관리자가 될 수 있습니다. 그것을 할 수
한 가지 방법은 개발자와 관리자 테이블이 하나의 시간을 조회 할 필요가 있도록 내가 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
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)
될 것이다. 어쨌든 옵티마이 저가이를 수행 할 수는 있지만 이는이를 명시 적으로 만듭니다.
또한이 솔루션은 관리자와 개발자 모두에게 중복을 반환하지 않습니다.
이 경우 UNION ALL을 사용합니다 ... UNION –
@Roland로 인해 부질의 결과를 불필요하게 중복 제거하는 중입니다. 엔진이 자동으로 처리합니다. 'MySQL'조차도 'IN'술어에서 'DISTINCT'를 무시할만큼 똑똑합니다. – Quassnoi
@Roland Bouman -이 재귀 UNION ALL이 어디서 왔는지 궁금합니다. 그래서 그것은 성능입니다. UNION 문은 기능이 실제로 관계형 데이터베이스 이론과 일치하는 모든 SQL 언어에서 한 곳이기 때문에 전환하지 않을 것이라고 생각합니다! –
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
)
Quassnoi - 좋다! 하지만 오타가 있습니다 - 사용자는 별칭이 필요합니다. –
@Roland : SO에 내장 쿼리 파서가 필요합니다! – Quassnoi
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)
당신은 정규화를 통해-데이터가 될 수 있다는 생각 해 봤나? – Timothy
누군가가 개발자, 관리자 또는 둘 다일 때 출력으로 기대하는 것은 무엇입니까? 그냥 user_id? 하나의 기록에서 그의 기능? 두 기록? –
@Lieven 그냥 user_id –