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:感谢您的反馈,已更正。
对于给定的@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
零件表没有分类标题栏。其相关通过PartCategories表 – Tyrsius 2012-01-05 01:37:09
@Tyrsius:已更正。 – 2012-01-05 01:41:59
你的第二个程序是否完成?我期望'ManufacturerId'和'CategoryId'的输入参数分别返回一个结果集。 – onedaywhen 2012-01-05 09:19:07
零件表没有类别ID列。它通过PartCategories表相关 – Tyrsius 2012-01-05 01:37:04
删除where子句给了我几乎所寻找的结果,所以我将其标记为已接受。我所做的只是添加一个独特的。 – Tyrsius 2012-01-05 16:01:12