2012-11-01 9 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 번 표시됩니다.

내가 무엇을 검색해야하는지 모르기 때문에 이런 종류의 문제를 찾는 것은 쉽지 않습니다. 3 테이블 문제, 외부 조인 문제 또는 단순한 구문 론적 대답입니까?

아니면 어셈블리를 사용하지 않고 순수한 계층 구조 테이블 구조로 전환하는 것이 더 좋을까요? 내가 가진 문제를 해결하기 위해 계층 적 테이블을 검색하는 것이 더 쉬울 것입니다.

저는 LibreOffice 3.5.6.2 Base를 사용하고 있습니다. 그것은 마법사와 다른 도움이되는 것들을 가지고 있지만, 내가 스스로 찾아내는 상황의 복잡성 에까지 미치지는 않습니다. 목표는 데이터베이스에 가격이 포함되어있어 아이템 가격에서 제품 가격을 적절히 산출하는 데 사용할 수 있다는 것입니다 그리고 어셈블리를 만드는 시간.

친절하게, 나는 너무 초보 다.

+0

에 오신 것을 환영합니다 :) 귀하의 질문은 좋은데, 일반적으로 당신이 시도한 것을 보여줄 수있는 좋은 제안입니다.) FAQ : http://stackoverflow.com/faq도 참조하십시오. . :) – ForceMagic

+0

다음 SELECT "tblProductList"와 같은 항목을 시도했습니다. "ProductID", "tblProductItems".("tblProductList". "ProductID"= "tblProductItems". "ProductID") LEFT JOIN "tblProductList", "tblProductList", "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를 사용하므로 보고서 생성 기능을 사용하여 보고서를 생성합니다. –