我有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
子类别:
分类
输出:
投诉表:
答案 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