【问题标题】:Generating a SQL (summary) table from multiple other tables从多个其他表生成 SQL(汇总)表
【发布时间】:2011-12-01 22:01:25
【问题描述】:

我有一个由几个子部分组成的单元。每个子部分都有一个表格,如下所示:

Part#ID    PartBarcode   BuildDate   comments
------    -----------   ---------   --------
##        someBC        datetime    string
##        someBC        datetime    string
##        someBC        datetime    string
....

上面的表我有 3 个

然后我有一个如下所示的子表:

PartID    PartSubBarcode1   PartSubBarcode1    PartSubBarcode1   BuildDate   comments
          (project code)    (intraproject S/N) (Antenna presence)
------    ---------------   ---------------    ---------------   ---------   --------
##        ABC               123                Z                 Datetime    string
##        ABC               124                X                 Datetime    string
##        ABC               125                Z                 Datetime    string

编辑:每个条码子部分都代表物理/项目属性。

那时他们都组装好了,我有一张桌子,里面有子部分作为一个单元

AssembledUnitID   Part1ID   Part2ID   Part3ID   Part4ID   ActiveState
---------------   -------   -------   -------   -------   -----------
##                ##        ##        ##        ##        true
##                ##        ##        ##        ##        false
##                ##        ##        ##        ##        true
...

我想创建一个表格,其中包含 活动 组装单元中所有子部分的条形码。额外的问题是,因为我有 1 个子部分,其中的条形码实际上分成了多列,所以我需要某种方法将组件连接成一个字符串供用户查看(或者不是真的......没什么大不了的)。

Part1BC   Part1BuildDate Part2BC Part2BuildDate  ...
-------   -------------- ------- --------------

这里的最终游戏是在 C#.NET 中的 WinForm 上填充一个 datagridview 对象,以便用户导航和查看库存状态。 如果用一条 SQL 语句填充这张表就好了。 代码的简洁性实际上并不重要,只要最终结果相同即可。

我的 SQL 新手技能结合阅读论坛帖子和帮助文档真的让我头晕目眩。我一直在尝试不同的 SELECT 语句,但它们似乎都没有真正让我有所收获。

附加信息: 我正在用 C#.NET 中的数据网格视图制作一个 winform 我正在连接到 Access 2007 .mdb 数据库。我将查询存储在 .xsd 文件中的 C# 解决方案中。 需要更多信息吗?


编辑: 做到了!这就是我为解决这个问题所做的! 在 C# .xsd 设计器中,我创建了一个新的 DataTable。通过数据表的表适配器,我创建了一个带有如下文本的查询:

SELECT 
            UnitBarcodes.GroupID + UnitBarcodes.Version
                + UnitBarcodes.SubSerial + UnitBarcodes.AntennaStatus AS [Unit Barcode],
            Subpart1.Barcode AS [part1 Board Barcode],
            Subpart2.Barcode AS [part2 Board Barcode],
            Subpart3.Barcode AS [part3 Board Barcode],
            AssembledUnits.DateAssembled AS [Date Assembled],
            Subpart1.OnBoardBuildDate AS [Firmware Build Date] FROM  ((((MainBoards INNER JOIN
            AssembledUnits ON Subpart1.ID = AssembledUnits.Subpart1ID)
    INNER JOIN
            UnitBarcodes ON AssembledUnits.UnitBarcodesID = UnitBarcodes.ID)
    INNER JOIN
            Subpart2 ON AssembledUnits.Subpart2ID = Subpart2.ID) 
    INNER JOIN
            Subpart3 ON AssembledUnits.Subpart3ID = Subpart3.ID)
    WHERE     (AssembledUnits.ActiveState = ?) AND (AssembledUnits.DateAssembled > ?)

一旦我填写了我设置的数据表

bindingSource1.DataSource=
dataGridView2.AutoResizeColumns();

(在调用查询之前,我还设置了 'dataGridView2.AutoGenerateColumns = true;' 并且当然在我的表单上创建了 dataGridView2 对象)

瞧!有用!多么棒的学习体验(而且比我最初想象的要简单得多)

【问题讨论】:

  • 你绝对应该阅读规范化。像你说的那样有许多表用于相同的数据(部分):I have 3 of the above tables 是一个禁忌。有许多列用于相同的数据(PartSubBarcode_XX 和 Part_XX_ID)是另一个禁忌。尝试将规范化问题标准化或发布为 SO 的新问题。归一化简介:en.wikipedia.org/wiki/Database_normalization
  • 每个零件都是独立生产的,并且有不同的制造日期,并且将来(由于零件故障)可能会组装成不同的整体单元。在示例中,每个子部分表具有相同的列,但实际上它们仅共享一些列/特征。有些有更多/更少/不同。
  • 至于将一个子部分中的条形码拆分开来,这似乎是应该做的事情,因为条形码本身有 4 个组件代表不同的事物。在这四个组件中,有 3 个描述了该部分的物理特性和第四个是项目的唯一编号(但可能不是普遍唯一的)。我想通过像这样将它们分开来减少冗余。但你不这么认为?
  • 不管怎样,我会阅读链接的文章,看看我能做什么。
  • 如果(PartSubBarcode1, PartSubBarcode2, PartSubBarcode3) 的意思是(ColourCode, StrengthCode, DiameterCode),那么就可以了(实际上是一个标准化步骤)。但在您详细描述之前,我们无法知道这一点。

标签: c# sql ms-access ms-access-2007


【解决方案1】:

不要在一个查询中完成

这是一个中等复杂的问题,您不想编写代码会使它变得更加困难。此外,MS Access 在编写查询方面比 SQL Server 数据库有更多限制,因此您可能会发现它更加困难。

【讨论】:

  • 我认为比我聪明的人知道如何在一份声明中做到这一点。但如果这不理想,您会如何建议分多个步骤来解决这个问题?
  • 您将不得不稍微清理一下您的解释,也许使用一个只有几行的示例来说明您的期望。
【解决方案2】:

假设您的 PartID 在所有表中都是唯一的,您可以尝试使用视图:

首先声明你的观点如下:

(请注意,为了方便重命名,我已将 [括号] 中命名的表包含在内)

CREATE VIEW View_AllSubparts AS

SELECT PartID, PartBarcode AS 'Barcode', BuildDate FROM [SubpartTable1]
UNION
SELECT PartID, PartBarcode AS 'Barcode', BuildDate FROM [SubpartTable2]
UNION
SELECT PartID, PartBarcode AS 'Barcode', BuildDate FROM [SubpartTable3]
UNION
SELECT PartID, PartSubBarcode1 + PartSubBarcode2 + PartSubBarcode3 AS 'Barcode', BuildDate FROM [SpecialSubpartTable]
GO

从那时起,您可以像在表中一样在语句中引用此视图。

从那里,您可以通过多次加入此视图来为您的单位构建您的选择

SELECT Part1.Barcode, Part1.BuildDate , Part2.Barcode, Part2.BuildDate , Part3.Barcode, Part3.BuildDate , Part4.Barcode, Part4.BuildDate 
FROM [AssembledUnit]
JOIN View_AllSubparts Part1 ON AssembledUnit.Part1ID = Part1.PartID
JOIN View_AllSubparts Part2 ON AssembledUnit.Part2ID = Part2.PartID
JOIN View_AllSubparts Part3 ON AssembledUnit.Part3ID = Part3.PartID
JOIN View_AllSubparts Part4 ON AssembledUnit.Part4ID = Part4.PartID

请注意,我不经常使用 Access 2007,但我做了快速检查,我认为 Access 不会拒绝这里的任何内容。告诉我。

【讨论】:

  • 我试过了,但 Access 不喜欢通过查询设计器创建视图,似乎还有另一种方法,但我还没有找到。此外,我认为这引导我朝着正确的方向去做我想做的事。确认后会更新。
猜你喜欢
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多