为什么我的查询返回重复记录?

时间:2017-03-28 07:50:02

标签: sql sql-server tsql sql-server-2012

我有3张桌子。

Complaints, Categories, SubCategories

类别的主键在投诉表中是外来的,即Cat_ID

类别表的主键在SubCategories中是外来的,即Category_ID

当我加入投诉与类别然后它工作正常,即唯一的行,但当我加入SubCategories然后它重复每个记录。我试过LEFT,RIGHT,INNER,但没有任何作用。

Select *
        From dbo.Complaints Comp
        inner Join Categories Cat
        ON cat.CategoryID= Comp.Cat_ID
        inner join SubCategories scat
        ON scat.Category_ID= cat.CategoryID

子类别:

enter image description here

分类

enter image description here

输出:

enter image description here

投诉表:

enter image description here

5 个答案:

答案 0 :(得分:1)

您是否尝试检查行是否真的独一无二?我曾经使用过几行表格,我有类似于你的问题,因为行不是唯一的。这是一个不同的专栏

答案 1 :(得分:1)

我认为你想要一个左连接到子类别和使用投诉表中包含的子类别信息:

SELECT *
FROM dbo.Complaints Comp
INNER JOIN Categories Cat
    ON cat.CategoryID = Comp.Cat_ID
LEFT JOIN SubCategories scat
    ON scat.Category_ID = cat.CategoryID
        AND scat.SubCategoryID = Comp.SubCat_ID

(我还建议使用null而不是0代表no subcategory,这就是我假设的0代表的<) / p>

答案 2 :(得分:0)

你需要在Complaints表中插入SubCategoryId,然后它将按你的愿望输出。基于此,您需要更改您的查询

Select *
        From dbo.Complaints Comp
        inner join SubCategories scat
        ON scat.SubCategoryId= Comp.SubCategoryId
        inner Join Categories Cat
        ON cat.CategoryID= scat.CategoryID

答案 3 :(得分:0)

如果您在“投诉”表中没有子类别ID,则无法确定应使用哪个子类别。因此,您可以获得每个类别的所有子类别。它是重复的来源。

将SubCat_Id添加到Complaints表中,并将其与此字段上的子类别连接。

答案 4 :(得分:0)

原因是您有8个与category = 1相关的子类别,因此当您将Complaints(value = 1)获得的类别加入子类别时,您将加入所有8个可能的值

在这种情况下如果你没有任何列形成子类别在选择最简单的解决方案是使用distinct子句,例如:

Select DISTINCT Comp.*, Cat.*
    From dbo.Complaints Comp
    inner Join Categories Cat
    ON cat.CategoryID= Comp.Cat_ID
    inner join SubCategories scat
    ON scat.Category_ID= cat.CategoryID

其他你也使用列子类作为子类别与select * ..这个行没有完全重复,因为你有(至少)与加入类别1相关的不同子类别

尝试使用显式列名(而不是*)

Select DISTINCT Comp.complainID
   , Comp.Mode_ID
   , Comp.Cat_Id
   , ...
   , Cat.CategoryID
   , Cat.Name
    From dbo.Complaints Comp
    inner Join Categories Cat
    ON cat.CategoryID= Comp.Cat_ID
    inner join SubCategories scat
    ON scat.Category_ID= cat.CategoryID