2013-02-26 113 views
0

的圖我有一個表稱爲成分,具有以下字段:創建基於三個不同的表

成份 - IngredientID(PK),ManufacturerID(FK),類別ID(FK),BarcodeID(FK) ,SizeID(FK),質量。

這張表的工作方式是這樣的:每種成分將基於一個製造商,類別或條形碼,只有三個之一,而且一個總是需要。因此,如果記錄具有ManufacturerID,則CategoryID和BarcodeID都將爲空,反之亦然。

有我的數據庫中其他三個表:

製造商 - ManufacturerID(PK),名稱

分類 - 類別ID(PK),名稱

條碼 - BarcodeID (PK),名稱

我需要一個如下所示的視圖:

查看 - ViewID(PK),IngredientID(FK),名稱,SizeID,質量

ViewID將是PK, IngredientID將是FK的配料記錄, 名稱將是來自制造商,類別或條碼錶的名稱字段,其基於三個字段中的哪一個在成分表中具有值 和SizeID質量將直接來自成分表。

我的SQL知識非常有限,我很感謝任何指導。請讓我知道我的問題描述是否缺乏重要信息。

編輯:更新視圖以包含FK IngredientID,這可能很有用。

+0

我不認爲你可以創建觀點PK,而對於其他數據經過[JOINS教程](http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins)並試圖寫查詢 – 2013-02-26 17:26:09

回答

2

像這樣的東西應該工作使用CASE聲明:

SELECT I.IngredientID, 
    CASE 
     WHEN I.ManufacturerID IS NOT NULL THEN M.Name 
     WHEN I.CategoryID IS NOT NULL THEN C.Name 
     WHEN I.BarcodeID IS NOT NULL THEN B.Name 
    END Name, 
    I.SizeID, 
    I.Quality 
FROM Ingredients I 
    LEFT JOIN Manufacturers M ON I.ManufacturerId = M.ManufacturerId 
    LEFT JOIN Categories C ON I.CategoryID = C.CategoryID 
    LEFT JOIN Barcodes B ON I.BarcodeID = B.BarcodeID 

這將使用IngredientId作爲主鍵 - 這就是我假設你想要的。不需要另一個主鍵。如果你真的只是想一個增量標識,然後使用ROW_NUMBER - 但我不明白爲什麼它會需要:

SELECT ROW_NUMBER() OVER (ORDER BY I.IngredientID), ... 
+0

工程很棒。我不知道你可以在SQL中做CASE,這是我認爲會更簡單的解決方案。謝謝! – Antrim 2013-02-26 17:36:12

+0

@ etc2702 - 沒問題,很高興我們可以幫忙!還有其他方法使用ISNULL或COALESCE,但這也許是最易理解的。祝你好運。 – sgeddes 2013-02-26 17:40:01

+0

合併可能會更快 - 用「COALESCE(M.Name,C.Name,B.Name」)替換CASE。 – 2013-02-26 17:53:25

1
select 
    i.IngredientID as ViewID, 
    isnull(m.Name, isnull(c.Name, isnull(b.Name, ''))) as Name 
    i.SizeID, 
    i.Quality 
from Ingredients i 
    left join Manufacturers m on i.ManufacturerID = m.ManufacturerID 
    left join Categories c on i.CategoryID = c.CategoryID 
    left join Barcodes b on i.BarcodeID = b.BarcodeID