外连接SQL表?

时间:2012-02-21 16:20:39

标签: sql sql-server database

我在数据库中有三个表 -

  1. 活动表,包含activity_id,activity_type
  2. category_id,category_name
  3. 的类别表
  4. 使用activity_id和category_id之间的映射链接表
  5. 我需要编写一个select语句来获取以下数据:

    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_id链接的人,我需要获取具有空值或空值的所有活动的数据作为category_name。

    请帮帮我。

    PS。我正在使用MS SQL Server DB

4 个答案:

答案 0 :(得分: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; 

答案 1 :(得分: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

答案 2 :(得分: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

祝你好运!

答案 3 :(得分: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,因为你没有提到那里可能存在一些缺失的元素