SQL结果:非空类别

时间:2012-01-05 01:04:16

标签: sql linq

这里的困难可能是糟糕的桌面设计的结果,如果它简化了事情,可以随意给出不同设计的答案。我还在学习规范化技术。

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

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

外键应该从结构中显而易见。零件只能有一个制造商,但它可以是多个类别。如果这个设计不好,请评论它的错误(我想学习)。

想法是,在查看时,您将选择制造商,然后选择类别,并查看部件列表。每个制造商的类别列表都是相同的,但并非每个制造商都有每个类别的零件。有些人会空着。我希望类别列表仅表示非空类别,因此我需要一种方法来构建哪些类别包含哪些制造商的部分的列表。我在查找如何从SQL或linq到实体生成此列表时遇到了很多麻烦。

2 个答案:

答案 0 :(得分:1)

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:感谢您的反馈,更正。

答案 1 :(得分:1)

对于给定的@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