0

次のフィールドを持つIngredientsというテーブルがあります。

成分-IngredientID(PK)、ManufacturerID(FK)、CategoryID(FK)、BarcodeID(FK)、SizeID(FK)、Quality。

この表の仕組みは次のとおりです。各材料は、メーカー、カテゴリ、またはバーコードのいずれかに基づいており、3つのうち1つだけであり、常に1つが必要です。したがって、レコードにManufacturerIDがある場合、CategoryIDとBarcodeIDは両方ともnullになり、その逆も同様です。

私のデータベースには他に3つのテーブルがあります。

メーカー-ManufacturerID(PK)、名前

カテゴリ-CategoryID(PK)、名前

バーコード-バーコードID(PK)、名前

次のようなビューが必要です。

ビュー-ViewID(PK)、IngredientID(FK)、Name、SizeID、Quality

ViewIDがPK、 IngredientIDが成分レコードのFK、 NameがManufacturers、Categories、またはBarcodesテーブルのいずれかから取得したNameフィールドで、3つのフィールドのどれがIngredientsテーブルに値を持っていたかに基づいています。SizeIDQualityは、Ingredientsテーブルから直接取得されます。

私のSQLに関する知識は非常に限られており、ガイダンスをいただければ幸いです。問題の説明に重要な情報が不足している場合はお知らせください。

編集:ビューを更新して、FKIngredientIDを含めました。これは便利な場合があります。

4

2 に答える 2

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を使用します-これは私があなたが望んでいたと思ったものです。別の主キーは必要ありません。本当に増分IDが必要な場合は、ROW_NUMBERを使用しますが、なぜそれが必要になるのかわかりません。

SELECT ROW_NUMBER() OVER (ORDER BY I.IngredientID), ...
于 2013-02-26T17:26:55.070 に答える
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
于 2013-02-26T17:28:39.937 に答える