从多个视图中选择

时间:2014-06-27 11:45:52

标签: sql-server tsql

我使用视图从数据库中提取信息。在前面提到的视图中,我需要有另一个层来负责从视图中选择信息。

视图非常大,并且其中大部分信息类型相同(有一些标志负责为特定图层选择正确类型的信息)。

可视化例如商品中的不同层。你得到一个托盘(view3)的项目,每个项目都包装在一个案例(view2),这个案子包含x项目,项目是基础层(view1)。

示例:

View1(single item)    View2 (multiple items)    View3 (all items)
10 cols               8 cols                    4 cols

我的观点的特别之处在于,大多数列在所有三个视图中都具有相同的名称。所以一个名为" Name"在View1,View2和View3中会是相同的,但不同的物理层在每个物理层中提取的信息量不同。

我应该废弃它,并将所有内容放在一个视图中,然后从那里选择标志吗?

负责从视图中提取信息的sql应该是一个存储过程。您输入了id和区域代码,并显示了该项目的所有不同图层。

1 个答案:

答案 0 :(得分:0)

您还没有真正提供有关

的足够数据
  • 如何构建3个视图(即他们选择的内容和位置)
  • 如何存储基础表数据

但这似乎是一个非常标准的1:N:M关系结构,但我会考虑这样的数据结构。

<强>表格

Items                               Cases                            Pallets
-------------------------           -------------------              ----------------------
Id        INT PK NOT NULL   +------> Id          INT PK NOT NULL +--> Id            INT PK NOT NULL
ItemCode  NVARCHAR(50)      |        CaseBarCode NVARCHAR(50)    |    PalletBarCode NVARCHAR(50)
ItemName  NVARCHAR(50)      |        PalletId    FK to Pallets --+
CaseID    FK To Cases ------+

使用这种类型的表数据结构,写入多个视图以查看来自

的数据应该是微不足道的

项目视角

CREATE VIEW ItemView
AS
BEGIN
     SELECT * FROM Items
END

案例透视

CREATE VIEW CaseView
AS 
BEGIN
    SELECT c.CaseBarCode
           ,Count(i.Id) As NumItems
    FROM   Items i JOIN Cases c ON i.CaseId = c.Id
    GROUP BY c.CaseBarCode
END

托盘视角

CREATE VIEW PalletView
AS 
BEGIN
    SELECT p.PalletBarCode
           ,Count(c.Id) As NumCases
    FROM   Cases c JOIN Pallets p on c.PalletId = p.Id
    GROUP BY p.PalletBarCode
END
相关问题