2012-01-05 45 views
1

這裏的困難可能是糟糕的表設計的結果,如果它簡化了一些事情,隨意用不同的設計給出答案。我仍然在學習規範化技術。SQL結果:非空類別

我有一個零件數據庫,併爲這個問題的範圍,它看起來像這樣:

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

外鍵應該是清楚的結構。零件只能有一個製造商,但它可以分爲多個類別。如果這種設計不好,請評論最新的錯誤(我想學習)。

的想法是,看的時候,你會選擇製造商,然後一個類別,並瞭解各部分的清單。類別列表對於每個製造商都是相同的,但並不是每個製造商都在每個類別中都有部件。有些將是空的。我希望類別列表僅代表非空類別,所以我需要一種方法來構建哪些類別包含哪些製造商的部件列表。我在計算如何生成這個列表時遇到了很多麻煩,無論是從SQL還是從LINQ到實體。

回答

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:感謝您的反饋,已更正。

+0

零件表沒有類別ID列。它通過PartCategories表相關 – Tyrsius 2012-01-05 01:37:04

+0

刪除where子句給了我幾乎所尋找的結果,所以我將其標記爲已接受。我所做的只是添加一個獨特的。 – Tyrsius 2012-01-05 16:01:12

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 
+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