基于三个不同的表创建视图

时间:2013-02-26 17:20:48

标签: sql sql-server tsql view

我有一个名为Ingredients的表,其中包含以下字段:

成分 - IngredientID(PK),ManufacturerID(FK),CategoryID(FK),条形码ID(FK),SizeID(FK),质量。

这个表的工作方式是这样的:每个成分将基于EITHER制造商,类别或条形码,只有三个中的一个,并且总是需要一个。因此,如果记录具有ManufacturerID,则CategoryID和BarcodeID都将为空,反之亦然。

我的数据库中还有其他三个表:

制造商 - ManufacturerID(PK),名称

类别 - CategoryID(PK),名称

条形码 - 条形码ID(PK),名称

我需要一个看起来像这样的视图:

查看 - ViewID(PK),IngredientID(FK),名称,SizeID,质量

ViewID 将是PK, IngredientID 将成为成分记录的FK, 名称将是来自制造商,类别或条形码表的名称字段,该字段基于这三个字段中的哪个字段在“成分”表中具有值, SizeID 质量将直接来自Ingredients表。

我对SQL的了解非常有限,我将不胜感激任何指导。如果我对问题的描述缺乏重要信息,请告诉我。

编辑:更新了视图以包含FK IngredientID,这可能很有用。

2 个答案:

答案 0 :(得分: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), ...

答案 1 :(得分: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