SQL结果:非空类别

问题描述:

这里的困难可能是糟糕的表设计的结果,如果它简化了一些事情,随意用不同的设计给出答案。我仍然在学习规范化技术。SQL结果:非空类别

我有一个零件数据库,并为这个问题的范围,它看起来像这样:

Parts   Manufacturers Categories PartCategories 
PartId   ManufacturerId CategoryId CategoryId 
Name   Name   Name  PartId 
ManufacturerId 

外键应该是清楚的结构。零件只能有一个制造商,但它可以分为多个类别。如果这种设计不好,请评论最新的错误(我想学习)。

的想法是,看的时候,你会选择制造商,然后一个类别,并了解各部分的清单。类别列表对于每个制造商都是相同的,但并不是每个制造商都在每个类别中都有部件。有些将是空的。我希望类别列表仅代表非空类别,所以我需要一种方法来构建哪些类别包含哪些制造商的部件列表。我在计算如何生成这个列表时遇到了很多麻烦,无论是从SQL还是从LINQ到实体。

SELECT 
    Categories.Name, 
    ... 
FROM 
    Categories 
    INNER JOIN PartCategories ON PartCategories.CategoryId=Categories.CategoryId 
    INNER JOIN Parts ON PartCategories.PartId=Parts.PartId 
    INNER JOIN Manufacturers on Parts.ManufacturerId=Manufacturers.ManufacturerId 
WHERE 
    Manufacturers.ManufacturerId=<your chosen ManufacturerId> 

的想法是使用只有那些分类中,可以连接到一个部分,即本身可连接到所选择的制造商。

@Thyrsius:感谢您的反馈,已更正。

+0

零件表没有类别ID列。它通过PartCategories表相关 – Tyrsius 2012-01-05 01:37:04

+0

删除where子句给了我几乎所寻找的结果,所以我将其标记为已接受。我所做的只是添加一个独特的。 – Tyrsius 2012-01-05 16:01:12

对于给定的@ManufacterIdToBeChecked

SELECT 
     c.CategoryId 
    , c.Name 
FROM 
    Categories AS c 
WHERE EXISTS 
     (SELECT * 
     FROM PartCategories AS pc 
      JOIN Parts AS p 
      ON p.PartId = pc.PartId 
     WHERE pc.CategoryId = c.CategoryId 
      AND p.ManufacturerId = @ManufacterIdToBeChecked 
    ) 

构建所有兼容ManufacturerIdCategoryId的列表:

SELECT DISTINCT 
     p.ManufacturerId 
    , pc.CategoryId 
FROM 
     Parts AS p 
    JOIN 
     PartCategories AS pc ON pc.PartId = p.PartId 
+0

零件表没有分类标题栏。其相关通过PartCategories表 – Tyrsius 2012-01-05 01:37:09

+0

@Tyrsius:已更正。 – 2012-01-05 01:41:59

+0

你的第二个程序是否完成?我期望'ManufacturerId'和'CategoryId'的输入参数分别返回一个结果集。 – onedaywhen 2012-01-05 09:19:07