Sql 如何跨由中间表连接的三个表进行查询?

Sql 如何跨由中间表连接的三个表进行查询?,sql,sql-server-2008,Sql,Sql Server 2008,我只是有一个可能很愚蠢的问题,但我不能解决这个问题 我目前有3个表: PROJECT PROJECT_CATEGORY CATEGORY 现在PROJECT\u CATEGORY是一个中间表,因此它只包含PROJECT和CATEGORY中的主键,如pID和cID 我知道如果我在表类别中有一个pID,我如何编写查询,但在这种情况下,我只有一个中间表。那么,我如何创建一个查询来检查这3个表,然后它将显示所有类别以及它们被分配到哪些项目?如果我理解正确,您想知道类别是否有项目。下面

我只是有一个可能很愚蠢的问题,但我不能解决这个问题

我目前有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