SQL Join自引用表

时间:2013-01-07 17:01:02

标签: sql sql-server-2008 tsql

我的数据库中有2个表作为Classification和Company_Classification。下面的结构只是一个例子,我在下面进一步给出了我的代码。

Classification
ClassId
ClassName
Parent_Id

Company_Classification
LinkId
CompanyId
ClassId

我需要计算属于父母分类的公司数量,并按父母分类对其进行分组。因此,属于每个儿童分类的公司将按其父母分类计算。

SELECT
  TOP (100) PERCENT dbo.CLASSIFICATION.class_name,
  COUNT(dbo.COMPANY_CLASSIFICATION.Company_ID) AS Count
FROM
  dbo.CLASSIFICATION
INNER JOIN dbo.COMPANY_CLASSIFICATION 
  ON dbo.CLASSIFICATION.class_id = dbo.COMPANY_CLASSIFICATION.Class_ID
WHERE     (dbo.CLASSIFICATION.parent_id = 0)
GROUP BY dbo.CLASSIFICATION.class_name
ORDER BY dbo.CLASSIFICATION.class_name

我不确定我是否正确地表达了我的问题。那么,基本上我怎样才能查询查询以获得按父分类(包括子记录)分组的公司记录?

谢谢,

3 个答案:

答案 0 :(得分:1)

第二个想法,看起来你可能有层次结构。

;WITH ClassificationHierarchy AS
(
    SELECT   ClassId
            ,ClassName
            ,RootParent = ClassId
    FROM Classification
    WHERE Parent_Id = 0
    UNION ALL
    SELECT   CS.ClassId
            ,CS.ClassName
            ,RootParent
    FROM ClassificationHierarchy    CH
    JOIN Classification             CS  ON CH.ClassId = CS.Parent_Id
)
SELECT RootParent, COUNT(*)
FROM ClassificationHierarchy    CH
JOIN Company_Classification     CC  ON CC.ClassId = CH.ClassId
GROUP BY RootParent

答案 1 :(得分:1)

您需要第二次加入分类表:

select cparent.class_name, count(*)
from Company_Classification cc join
     Classification c
     on cc.Classid = C.ClassId join
     Classification cparent
     on c.parent_id = cparent.classid
group by cparent.class_name

答案 2 :(得分:0)

因为你在那里使用TOP条款?如果你想计算每个分类的数量必须删除顶部。

如果您想要的是前100家公司可能有意义,那么您必须创建一个具有顶部的子查询,并将这些子查询与主查询一起创建。