2012-01-10 52 views
1

我有三个表。 第一个表是活动,第二个是成员,最后是消息。 活动有一个名为Members_ID的外键,主键是Activity_ID。 成员的主键是Members_ID。 消息记录了Activity_ID和Members_ID。 我想要搜索活动NATURAL JOIN成员和我需要一个新的列数为 消息的message_ID其中Activity_ID是相同的。关于嵌套查询和NATURAL JOIN的SQL查询

NATURAL JOIN:

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

COUNT(MESSAGE_ID):

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

的问题是: 如何将上述两件事情一起搜索? 我想有一个表具有活动NATURAL JOIN成员具有相同的Activities.Members_ID 和一个虚拟列,它是从表消息COUNT(message_ID)。

+2

问题是什么? – 2012-01-10 21:23:01

+0

问题是什么? – keni 2012-01-10 21:23:11

+2

我建议避免自然连接;明确指出你的连接谓词是一种更好的做法,IMO。 – 2012-01-10 21:55:19

回答

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消息WHERE Activity_ID = a.Activity_ID和Members_ID = m.Members_ID 不是我需要的正确结果 因为不同的成员可能插入到相同的活动。消息表可能有不同成员的两条记录,但具有相同的activity_ID。 – 2012-01-10 22:09:05

+0

SELECT *,(SELECT COUNT(message_ID)FROM Message WHERE Activity_ID = a.Activity_ID)AS Message_Count FROM AS AS JOIN成员AS m on a.Members_ID = m.Members_ID; – 2012-01-10 22:20:27

+0

这是正确的答案。 感谢您为Tim Lehner和所有人。 – 2012-01-10 22:24:04

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仅仅是一个例子。 – 2012-01-10 21:29:17

+0

@于春林见我编辑的答案。那更像你想要的吗? – 2012-01-10 21:30:23

+0

谢谢乔。但它看起来不像我想要的。 – 2012-01-10 21:32:30

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