这里的困难可能是糟糕的桌面设计的结果,如果它简化了事情,可以随意给出不同设计的答案。我还在学习规范化技术。
我有一个零件数据库,对于这个问题的范围,它看起来像这样:
Parts Manufacturers Categories PartCategories
PartId ManufacturerId CategoryId CategoryId
Name Name Name PartId
ManufacturerId
外键应该从结构中显而易见。零件只能有一个制造商,但它可以是多个类别。如果这个设计不好,请评论它的错误(我想学习)。
想法是,在查看时,您将选择制造商,然后选择类别,并查看部件列表。每个制造商的类别列表都是相同的,但并非每个制造商都有每个类别的零件。有些人会空着。我希望类别列表仅表示非空类别,因此我需要一种方法来构建哪些类别包含哪些制造商的部分的列表。我在查找如何从SQL或linq到实体生成此列表时遇到了很多麻烦。
答案 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
)
要构建所有兼容的ManufacturerId
和CategoryId
的列表:
SELECT DISTINCT
p.ManufacturerId
, pc.CategoryId
FROM
Parts AS p
JOIN
PartCategories AS pc ON pc.PartId = p.PartId