2013-09-05 2 views
1

이 간단한 질문에 대해 유감스럽게 생각했지만 몇 가지 오래된 질문을 살펴본 결과 필요한 답을 찾을 수 없었습니다.SQL : 3 개의 테이블 합치기

나는 3 개의 테이블 모두 user_id (각 테이블마다 다르게 이름이 지정되었지만)가 있으며 각 테이블의 조건과 함께 결합하려고합니다. 나는 전에 2 개의 테이블로 JOIN을 수행했고, 왜 내 아래 쿼리가 오류를 던지고 있는지 궁금해.

SELECT c.user_id FROM 
    (SELECT userid from database_all where date='2013-09-03' AND college='Harvard') a 
JOIN 
    (SELECT userid2 FROM database_users) b 
ON 
    a.userid = b.userid2 
JOIN 
    (SELECT user_id FROM database_courses where num_courses < 3) c 
ON 
    b.userid2 = c.user_id 
+0

오류 메시지는 무엇인가? – Taryn

+0

무엇이 오류입니까? 어떤 SQL DBMS를 사용하고 있습니까? – MirroredFate

+0

아마 yyyy-mm-dd 형식 때문에 MySQL과 비슷하게 보입니다. 구문 론적으로 무효 인 것은 아무것도 없습니다. –

답변

2

이 쿼리는 문제 해결해야

SELECT 
    database_courses.user_id 
FROM 
    database_all 
JOIN 
    database_users ON database_all.userid=database_users.userid2 
JOIN 
    database_courses ON database_users.userid2=database_courses.userid 
WHERE 
    database_all.date='2013-09-03' AND database_all.college='Harvard' AND database_courses.num_courses < 3 
+0

4 번 줄 다음에 "누락 된 EOF"오류가 발생합니다. 분명히 "그대로"라고하지 않습니다. – user1899415

+0

수정 된 답을 사용해보세요. – Simon

+0

효과가 있다는 것을 알면 다행입니다! 이제 회사에서 별명을 사용할 수 없다는 것을 알고 있습니다 .- 내부 dbms ;-) – Simon

0

이 비슷한 더 많은 것을보십시오 :

SELECT c.user_id FROM database_all AS a 
JOIN database_users AS u ON a.userid=u.userid2 
JOIN database_courses AS c ON b.userid2=c.user_id 
WHERE a.data='2013-09-03' 
AND a.college='Harvard' 
AND c.num_courses<3 

는 일반적으로 당신이 마지막에 당신의 WHERE 조항을 넣어야을하고 DBMS 것 당신을 위해 쿼리를 최적화하십시오.

사실 매우 비슷한 질문이 here입니다.

MySQL 설명서에서는 해당 섹션의 SELECT syntax에 대해서도 설명합니다.

SELECT 
    [ALL | DISTINCT | DISTINCTROW ] 
     [HIGH_PRIORITY] 
     [STRAIGHT_JOIN] 
     [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] 
     [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] 
    select_expr [, select_expr ...] 
    [FROM table_references 
    [WHERE where_condition] 
    [GROUP BY {col_name | expr | position} 
     [ASC | DESC], ... [WITH ROLLUP]] 
    [HAVING where_condition] 
    [ORDER BY {col_name | expr | position} 
     [ASC | DESC], ...] 
    [LIMIT {[offset,] row_count | row_count OFFSET offset}] 
    [PROCEDURE procedure_name(argument_list)] 
    [INTO OUTFILE 'file_name' export_options 
     | INTO DUMPFILE 'file_name' 
     | INTO var_name [, var_name]] 
    [FOR UPDATE | LOCK IN SHARE MODE]] 

당신이 볼 수 있듯이

표 참조로 FROM 절은 WHERE 절 바로 앞에 온다.

0

또는

Select distinct u.user_id -- I think you might not want the same userId repeated ??? 
From database_users u 
    join database_courses c 
     On c.userId = u.UserId 
     And c.num_courses < 3 
    join database_all a 
     On a.UserId = u.UserId 
     And a.date='2013-09-03' 
     And a.college='Harvard' 
+0

userid2가 기본이고 따라서 별개이므로 참여하고있는 상황에서 그는 별개가 필요하다고 생각하지 않습니다. ..? – MirroredFate