我在数据库中有三个表 -
我需要编写一个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
答案 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子句将您的整体数据限制为存在于所有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
,因为你没有提到那里可能存在一些缺失的元素