2012-02-21 76 views
1

我在数据库中有三代表 - 与ACTIVITY_ID外连接SQL表?

  1. 活动表,与CATEGORY_ID ACTIVITY_TYPE
  2. 分类表,CATEGORY_NAME
  3. 链接表ACTIVITY_ID之间的映射和CATEGORY_ID

我需要编写选择语句以获得以下数据:

activity_id, activity_type, Category_name. 

问题是一些activity_id在链接表中没有条目。

如果我写:

select a.activity_id, a.activity_type, c.category_name 
from activity a, category c, link l 
where a.activity_id = l.activity_id and c.category_id = l.category_id 

然后我没有得到的数据是不存在的链接表的activity_ids。 我需要将所有具有空值或空值的活动的数据作为category_name,以获得那些没有任何category_id链接的数据。

请帮帮我吧。

PS。我正在使用MS SQL Server DB

+2

不要使用那些旧式的隐式'JOIN's! **永远!** – JNK 2012-02-21 16:23:31

+0

然后任何其他解决方案? – 2012-02-21 16:27:24

+2

使用明确的'JOIN'语法。 – JNK 2012-02-21 16:27:46

回答

2

我相信你正在寻找一个LEFT OUTER JOIN为你的活动表来返回所有行。

SELECT 
a.activity_id, a.activity_type, c.category_name 
FROM activity a 
LEFT OUTER JOIN link l 
ON a.activity_id = l.activity_id 
LEFT OUTER JOIN category c 
ON c.category_id = l.category_id; 
2

你应该用正确的明确连接:

select a.activity_id, a.activity_type, c.category_name 
from activity a 
LEFT JOIN link l 
ON a.activity_id = l.activity_id 
LEFT JOIN category c 
ON l.category_id = c.category_id 
0

怎么样?

select a.activity_id, a.activity_type, c.category_name from category c 
left join link l on c.category_id = l.category_id 
left join activity a on l.activity_id = a.activity_id 

事实上,先加入看来,它可能是一个inner join,因为你没有提到可能会有一些遗漏的元素有

+0

给出相同的旧结果。 – 2012-02-21 16:38:30

1

如果写这种类型的逻辑将是你正在进行的一部分责任,我强烈建议你对连接进行一些研究,包括连接和where子句之间的相互作用。无论用于检索数据的技术如何,连接和where子句结合起来形成查询写入的主干。

最关键的加盟信息,以了解:

  • 左外连接:检索来自“左”表中存在的连接表
  • 内加入所有的信息和任何记录:仅检索存在的记录在这两个表中
  • Where子句:用于限制数据,不管内部或外部联接定义。

在您发布的示例中,where子句将您的总体数据限制为存在于所有3个表中的行。用适当的连接逻辑替换where子句将会诀窍:

select a.activity_id, a.activity_type, c.category_name 
from activity a 
    left outer join link l --return all activity rows regardless of whether the link exists 
      on a.activity_id = l.activity_id 
left outer join category c --return all activity rows regardless of whether the link exists 
      on c.category_id = l.category_id 

祝你好运!