Sql 如何跨由中间表连接的三个表进行查询?
我只是有一个可能很愚蠢的问题,但我不能解决这个问题 我目前有3个表:Sql 如何跨由中间表连接的三个表进行查询?,sql,sql-server-2008,Sql,Sql Server 2008,我只是有一个可能很愚蠢的问题,但我不能解决这个问题 我目前有3个表: PROJECT PROJECT_CATEGORY CATEGORY 现在PROJECT\u CATEGORY是一个中间表,因此它只包含PROJECT和CATEGORY中的主键,如pID和cID 我知道如果我在表类别中有一个pID,我如何编写查询,但在这种情况下,我只有一个中间表。那么,我如何创建一个查询来检查这3个表,然后它将显示所有类别以及它们被分配到哪些项目?如果我理解正确,您想知道类别是否有项目。下面
PROJECT
PROJECT_CATEGORY
CATEGORY
现在PROJECT\u CATEGORY
是一个中间表,因此它只包含PROJECT
和CATEGORY
中的主键,如pID
和cID
我知道如果我在表
类别中有一个pID
,我如何编写查询,但在这种情况下,我只有一个中间表。那么,我如何创建一个查询来检查这3个表,然后它将显示所有类别以及它们被分配到哪些项目?如果我理解正确,您想知道类别是否有项目。下面的查询显示有多少个项目与给定类别关联
select c.*, p.*
from categories c
inner join PROJECT_CATEGORY pc on pc.category_id = c.id
inner join projects p on pc.project_id = p.id
如果需要与所有类别关联的所有项目的列表,可以使用第二个查询。类别4将不会显示在第二个结果中,因为没有与此类别关联的项目,因此内部联接将不显示。如果要显示类别4,则必须将内部联接
更改为左侧外部联接
脚本:
输出:
有一个c
缺失:来自类别c
谢谢,我忘了我可以使用不止一次的内部连接^^@Pedro:谢谢。更正了。
CREATE TABLE project
(
projectid INT NOT NULL
, projectname VARCHAR(20) NOT NULL
);
CREATE TABLE projectcategory
(
projectid INT NOT NULL
, categoryid INT NOT NULL
);
CREATE TABLE category
(
categoryid INT NOT NULL
, categoryname VARCHAR(20) NOT NULL
);
INSERT INTO project (projectid, projectname) VALUES
(1, 'project 1'),
(2, 'project 2'),
(3, 'project 3');
INSERT INTO category (categoryid, categoryname) VALUES
(1, 'category 1'),
(2, 'category 2'),
(3, 'category 3'),
(4, 'category 4');
INSERT INTO projectcategory (projectid, categoryid) VALUES
(1, 1),
(3, 2),
(2, 1),
(2, 2),
(2, 3),
(2, 2);
SELECT c.categoryid
, c.categoryname
, COUNT(pc.categoryid) Number_Of_Projects
FROM category c
left outer join projectcategory pc
on pc.categoryid = c.categoryid
GROUP BY c.categoryid
ORDER BY c.categoryname;
SELECT c.categoryid
, c.categoryname
, p.projectid
, p.projectname
FROM category c
inner join projectcategory pc
on pc.categoryid = c.categoryid
inner join project p
on p.projectid = pc.projectid
ORDER BY c.categoryname;
CATEGORYID CATEGORYNAME NUMBER_OF_PROJECTS
---------- ------------ ------------------
1 category 1 2
2 category 2 3
3 category 3 1
4 category 4 0
CATEGORYID CATEGORYNAME PROJECTID PROJECTNAME
---------- ------------ --------- -----------
1 category 1 1 project 1
1 category 1 2 project 2
2 category 2 3 project 3
2 category 2 2 project 2
2 category 2 2 project 2
3 category 3 2 project 2