2012-11-01 43 views
1

我有產品。每件產品都由物品和裝配組成。組件本身也可以由項目組成。所以它是一個層次結構,但深度有限。我想要做的是列出產品及其包含的產品和配件,以及產品配件中的所有產品。具有多個表和可能的外連接的半分層SQL查詢

這是我希望看到的輸出。它不必看起來像這樣,但目標是顯示產品中的物品,然後是裝配,並在每個裝配中顯示其中的物品。列數不固定,如果需要顯示組件中的項目更多信息,則不會有問題。

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。

+0

歡迎來到這裏:)你的問題很好,雖然它通常是一個很好的實踐,告訴我們你已經嘗試過;)我建議你看看我們的FAQ:http://stackoverflow.com/faq 。 :) – ForceMagic

+0

我試過像下面的選擇「tblProductList」。「ProductID」,「tblProductItems」的東西。「ItemID」「tblProductAssemblies」「AssemblyID」FROM「tblProductList」LEFT JOIN「tblProductItems」ON(「tblProductList」。「ProductID」=「tblProductItems」。「ProductID」)LEFT JOIN「tblProductAssemblies」ON(「tblProductList」。「 ProductID「=」tblProductAssemblies「。」ProductID「),但我只是得到每個產品重複項目*程序集時間(例如3個程序集x 5個項目意味着我得到一個產品重複15次)。我嘗試了左右。正如我所說,除了使用單個表格之外,我不知道連接語法足以做任何事情。 –

+0

您可以編輯自己的帖子來添加此信息,只需點擊「編輯」鏈接;) – ForceMagic

回答

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來完成,但最好的方法取決於你正在使用的數據庫。

+0

感謝您的。我會用你的榜樣玩一玩。您對查詢如何工作的解釋對於制定查詢的不同部分非常有幫助。我使用LibreOffice 3.5,以便使用它的報告生成功能來生成報告。 –