基于三个不同的表创建视图
Posted
技术标签:
【中文标题】基于三个不同的表创建视图【英文标题】:Create a view based on three different tables 【发布时间】:2013-02-26 17:20:47 【问题描述】:我有一个名为“成分”的表,其中包含以下字段:
成分 - 成分 ID (PK)、制造商 ID (FK)、类别 ID (FK)、条形码 ID (FK)、尺寸 ID (FK)、质量。
此表的工作方式是这样的:每种成分都将基于制造商、类别或条形码,三者中只有一个,并且始终需要一个。因此,如果一条记录有 ManufacturerID,CategoryID 和 BarcodeID 都将为 null,反之亦然。
我的数据库中还有另外三个表:
制造商 - 制造商 ID (PK)、名称
类别 - CategoryID (PK)、名称
条码 - 条码 ID (PK)、名称
我需要一个看起来像这样的视图:
视图 - 视图ID (PK)、成分ID (FK)、名称、尺寸ID、质量
ViewID 将是 PK, IngredientID 将是成分记录的 FK, Name 将是来自制造商、类别或条形码表的名称字段,基于三个字段中的哪一个在成分表中具有值, SizeID 和 Quality 将直接来自成分表。
我对 SQL 的了解非常有限,如果有任何指导,我将不胜感激。如果我对问题的描述缺少任何重要信息,请告诉我。
编辑:更新了视图以包含 FK 成分 ID,这可能很有用。
【问题讨论】:
我认为您不能在视图中创建 PK,其他数据通过 JOINS tutorial here 并尝试编写查询 【参考方案1】:这样的事情应该使用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), ...
【讨论】:
效果很好。我不知道你可以在 SQL 中做一个 CASE,这是一个我认为会更简单的解决方案。谢谢! @etc2702 -- 没问题,很高兴我们能提供帮助!还有其他使用 ISNULL 或 COALESCE 的方法,但这可能是最易理解的。祝你好运。 Coalesce 可能更快 - 将 CASE 替换为“COALESCE(M.Name, C.Name, B.Name”。【参考方案2】: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
【讨论】:
以上是关于基于三个不同的表创建视图的主要内容,如果未能解决你的问题,请参考以下文章