2

我有产品。每个产品都由项目和组件组成。程序集本身也可以由项目组成。所以这是一个层次结构,但深度有限。我想做的是列出产品及其包含的项目和组件,以及产品组件中的任何项目。

这是我想看到的输出。它不必看起来完全像这样,但目的是显示产品中的项目,然后是组件,然后在每个组件中显示其中的项目。列数不是固定的,如果需要更多来显示程序集中的项目,那没有问题。

ProductID ProductName AssemblyID AssemblyName ItemID ItemName
--------- ----------- ---------- ------------ ------ --------
 P0001001 Product One
                                               I0045 Item A
                                               I0082 Item B
                          A00023 Assembly 1
                                               I0320 Item 1
                                               I0900 Item 2
                          A00024 Assembly 2
                                               I0877 Item 3
                                               I0900 Item 2
                                               I0042 Item 4

然后,我可以使用它来构建按产品 ID 分组的报告,以列出每个产品的内容。

这是我目前的表结构。

+ProductList-+             +ProductItems-+                                  
|ProductID   | ----------> |ProductID    |                                   +ItemList-+
|ProductName | \           |ItemID       | --------------------------------> |ItemID   |
|Price       |  \          +-------------+                                 > |ItemName |
+------------+   \                                                        /  |Cost     |
                  \    +ProductAssemblies-+                              /   +---------+
                   \-> |ProductID         |       +AssemblyItems-+      /
                   +-- |AssemblyID        | ----> |AssemblyID    |     /
                   |   |BuildTime         |       |ItemID        | ---/
                   |   +------------------+       +--------------+
                   |
                   |   +AssemblyList-+
                   +-> |AssemblyID   |
                       |AssemblyName |
                       +-------------+

我需要什么样的 SELECT 语句才能做到这一点。

我想我需要某种外连接,但我并不完全了解 SQL 语法来了解如何构造 select 语句。我所有的努力总是导致产品在每个项目和组件中被多次列出。因此,如果一个产品有 3 个项目和 2 个组件,则该产品出现 6 次。

搜索这类问题并不容易,因为我不知道我需要搜索什么。是三表问题,外连接问题,还是只是一个简单的句法答案。

还是在不使用程序集的情况下切换到纯层次表结构会更好?然后在分层表上搜索以解决我可能遇到的任何问题会更容易。

我正在使用 LibreOffice 3.5.6.2 Base。它有向导和其他有用的东西,但它们并没有扩展到我发现自己所处的复杂情况。目的是数据库包含价格,它可以用来从物品成本中适当地定价产品以及构建组件的时间。

温柔点,我是SO的新手。

4

1 回答 1

0

正常的 SQL 方法会将所有数据放在一行上,而不是分成几行。因此,您的数据将如下所示:

ProductID ProductName AssemblyID AssemblyName ItemID ItemName
--------- ----------- ---------- ------------ ------ --------
 P0001001 Product One                          I0045 Item A
 P0001001 Product One                          I0045 Item B
 P0001001 Product One     A00023 Assembly 1    I0320 Item 1
 P0001001 Product One     A00023 Assembly 1    I0320 Item 2
 . . .

例如,对于给定的项目,产品和装配信息不会是空白的。所有人都在同一条线上。

此信息来自两个来源,产品项目和装配项目。以下查询获取每个组件,然后将它们联合在一起,最后按产品对结果进行排序:

select *
from ((select p.Productid, p.ProductName, NULL as AssemblyId, NULL as AssemblyName, il.Itemid, il.ItemName
       from Product p join
            ProductItems pi
            on p.productId = pi.ProductId join
            ItemList il
            on pi.ItemId = il.ItemId
      ) union all
      (select p.Productid, p.ProductName, al.AssemblyId, al.AssemblyName, il.Itemid, il.ItemName
       from Product p join
            ProductAssemblies pa
            on pa.ProductId = p.ProductId join
            AssemblyList al
            on pl.AssembyId = al.AssemblyId, join
            AssemblyItems ai
            on al.AssemblyItems join
            ItemList il
            on p.ItemId = il.ItemId
      )
     ) t
order by 1, 2, 3, 4, 5, 6

通常,重组为您想要的格式将在应用程序级别完成。您可以在 SQL 中执行此操作,但最佳方法取决于您使用的数据库。

于 2012-11-01T16:05:52.870 回答