2013-02-26 111 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