2012-01-10 2 views
1

세 개의 테이블이 있습니다. 첫 번째 테이블은 Activities이고 두 번째 테이블은 Members이고 last는 Members입니다. 활동에 Members_ID라는 외래 키가 있고 기본 키가 Activity_ID입니다. 회원의 기본 키는 Members_ID입니다. 메시지에 Activity_ID 및 Members_ID가 기록되었습니다. 활동에 대해 검색하고 싶습니다. NATURAL JOIN 회원 및 에 대한 새 열 개수가 필요합니다. 메시지의 message_ID (Activity_ID가 동일한 경우).중첩 쿼리 및 NATURAL JOIN에 대한 SQL 쿼리

자연은 가입 :

SELECT* 
    FROM Activities 
     NATURAL JOIN Members 
    WHERE Activities.Members_ID = Members.Members_ID; 

COUNT (여기서 message) :

SELECT COUNT(message_ID) 
    FROM Message 
    WHERE Activity_ID = 123; 

질문은 다음과 같습니다 어떻게 함께 위의 두 가지를 검색 할? 동일한 활동을 가진 활동 NATURAL JOIN 멤버가있는 테이블을 갖고 싶습니다 .Members_ID 및 Message 테이블의 COUNT (message_ID) 인 가상 컬럼.

+2

문제는 무엇입니까? –

+0

무엇이 문제입니까? – keni

+2

자연스러운 조인을 피하는 것이 좋습니다. 명시 적으로 조인 술어를 언급하는 것이 더 나은 관행 인 IMO입니다. –

답변

0

아마 당신은이 같은 상관 하위 쿼리를 사용하려면 :

SELECT *, (SELECT COUNT(message_ID) FROM Message WHERE Activity_ID = a.Activity_ID AND Members_ID = m.Members_ID) AS Message_Count 
    FROM Activities AS a 
     NATURAL JOIN Members AS m 
    WHERE a.Members_ID = m.Members_ID; 

, 나는 자연 조인 구문 피할 것 :

SELECT *, (SELECT COUNT(message_ID) FROM Message WHERE Activity_ID = a.Activity_ID AND Members_ID = m.Members_ID) AS Message_Count 
    FROM Activities AS a 
     JOIN Members AS m on a.Members_ID = m.Members_ID; 
+0

감사합니다. (메시지 (SELECT_COUNT (message_ID) FROM 메시지 _Activity_ID 및 Members_ID = m.Members_ID 은 내가 원하는 결과가 아님) 다른 회원이 메시지 표에는 다른 구성원이지만 동일한 activity_ID의 두 레코드가있을 수 있습니다. –

+0

SELECT *, (메시지 CO_ (message_ID) FROM 메시지 WH_Activity_ID = a.Activity_ID) SELECT 메시지 _ 보낸 사람 활동 범위 : JOIN 구성원 a.m.Members_ID = m.Members_ID; –

+0

맞습니다 답변 : 팀 레너와 모든 분들께 감사드립니다 . –

0
SELECT a.Activity_ID, a.col1, a.col2, ..., a.colx, COUNT(mg.message_ID) 
    FROM Activities a 
     INNER JOIN Members m 
      ON a.Members_ID = m.Members_ID 
     INNER JOIN Message mg 
      ON a.Activity_id = m.Activity_ID 
    GROUP BY a.Activity_ID, a.col1, a.col2, ..., a.colx; 
+0

Activity_ID가 조인 m에서 필요합니다. Activity_ID = 123은 단지 예일뿐입니다. –

+0

@YuChunLin 편집 된 답변보기 그게 니가 원하는 것과 더 비슷한가요? –

+0

감사합니다. 그러나 그것은 내가 원하는 것처럼 보이지 않습니다. –

1
WITH MessageTallies 
    AS 
    (
     SELECT Activity_ID, COUNT(message_ID) AS tally 
     FROM Message 
     GROUP 
      BY Activity_ID 
    ) 
SELECT * 
    FROM Activities 
     NATURAL JOIN Members 
     NATURAL JOIN MessageTallies 
UNION CORRESPONDING 
SELECT *, 0 AS tally 
    FROM Activities 
     NATURAL JOIN Members 
WHERE Activity_ID NOT IN (SELECT Activity_ID FROM MessageTallies):