0

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

成分- 成分 ID (PK)、制造商 ID (FK)、类别 ID (FK)、条形码 ID (FK)、尺寸 ID (FK)、质量。

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

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

制造商- 制造商 ID (PK)、名称

类别- CategoryID (PK)、名称

条形码- BarcodeID (PK)、名称

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

视图- 视图 ID (PK)、成分 ID (FK)、名称、尺寸 ID、质量

其中ViewID将是 PK, 成分ID 将是成分记录的 FK, 名称将是来自制造商、类别或条形码表的名称字段,这取决于三个字段中的哪一个在成分表中具有值,并且SizeIDQuality将直接来自成分表。

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

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

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 回答