2016-09-24 2 views
-2

여러 개의 하위 테이블이있는 제품 - 호스, 스틸 튜브, ​​전기 케이블, Fiberoptics.다중 테이블의 행을 단일 테이블로 결합

ProductId - 제품 테이블의 기본 키 ProductId- 호스, 강철 튜브, 전기 케이블, Fiberoptics의 ForeignKey 필드.

제품 테이블은 자식 테이블 내가 모든 테이블의 결과를 결합하려는

많은 관계로 1가있다. 예를 들어 - 제품 P1에는 모든 하위 테이블에서 FK로 사용되는 PK 필드 ProductId가 있습니다.

호스 테이블에 ProductId 50이 4 개 있고 Steeltubes 테이블에 ProductId 50이있는 레코드가 두 개있는 경우 왼쪽 결합을 수행하면 왼쪽 결합은 결과로 8 개 레코드를 보여주는 레코드의 카티 션 곱을 수행하지만 4 개의 레코드 여야합니다. 당신의 네 개의 레코드가 다른 테이블의 첫 번째 레코드와 결합되어 다음 네 개의 레코드가의 두 번째 레코드와 결합되어 있기 때문에

   ;with HOSESTEELCTE 
     as 
     (
    select '' as ModeType, '' as FiberOpticQty , '' as NumberFibers, '' as FiberLength, '' as CableType , '' as Conductorsize , '' as Voltage,'' as ElecticCableLength , s.TubeMaterial , s.TubeQty, s.TubeID , s.WallThickness , s.DWP ,s.Length as SteelLength , h.HoseSeries, h.HoseLength ,h.ProductId 
    from Hoses h 
    left join 
    (
    --'' as HoseSeries,'' as HoseLength , 
    select TubeMaterial , TubeQty, TubeID , WallThickness , DWP ,  Length,ProductId from SteelTubes 
    ) s on (s.ProductId = h.ProductId) 

) select * from HOSESTEELCTE 
+0

MySQL의 태그를 얻을. –

답변

1

하위 테이블 사이에 관계가 없다고 가정하고 제품을 구성하는 모든 하위 엔티티 목록을 원한다면 모든 열에있는 항목의 최대 수와 동일한 수의 행을 갖는 cte를 생성 할 수 있습니다. 제품에 대한 하위 테이블. 아래 예제에서 예제를 단순화하기 위해 dates 테이블을 사용했습니다. 이 데이터

create table products(pid int); 
insert into products values 
(1),(2); 
create table hoses (pid int,descr varchar(2)); 
insert into hoses values (1,'h1'),(1,'h2'),(1,'h3'),(1,'h4'); 
create table steeltubes (pid int,descr varchar(2)); 
insert into steeltubes values (1,'t1'),(1,'t2'); 
create table electriccables(pid int,descr varchar(2)); 
truncate table electriccables 
insert into electriccables values (1,'e1'),(1,'e2'),(1,'e3'),(2,'e1'); 

;with cte as 
    (select row_number() over(partition by p.pid order by datekey) rn, p.pid 
    from dimdate, products p 
    where datekey < 20050105) 

select * from cte 

은 (암시 적 도움이 참여 곳 드문 ocassions 중 하나)에 가입 카티을 만들이 CTE에 대한 그래서이 RN 결과 PID

rn     pid 
-------------------- ----------- 
        1   1 
        2   1 
        3   1 
        4   1 
        1   2 
        2   2 
        3   2 
        4   2 

그리고 자식 테이블을 추가하면

;with cte as 
(select row_number() over(partition by p.pid order by datekey) rn, p.pid 
from dimdate, products p 
where datekey < 20050106) 
select c.pid,h.descr hoses,s.descr steeltubes,e.descr electriccables from cte c 
left join (select h.*, row_number() over(order by h.pid) rn from hoses h) h on h.rn = c.rn and h.pid = c.pid 
left join (select s.*, row_number() over(order by s.pid) rn from steeltubes s) s on s.rn = c.rn and s.pid = c.pid 
left join (select e.*, row_number() over(order by e.pid) rn from electriccables e) e on e.rn = c.rn and e.pid = c.pid 
where h.rn is not null or s.rn is not null or e.rn is not null 
order by c.pid,c.rn 

우리는 CTE가 없기 때문에 삭제이

pid   hoses steeltubes electriccables 
----------- ----- ---------- -------------- 
      1 h1 t1   e1 
      1 h2 t2   e2 
      1 h3 NULL  e3 
      1 h4 NULL  NULL 
      2 NULL NULL  e1 
+0

감사합니다 P.Salmon 당신은 내 하루를 보냈습니다. 너는 천재적이다. 건배 !!!!!!!! –

0

사실, 8 개 행을 갖는 결과는 결과가 될 것으로 예상 할 수있다 다른 테이블은 4 + 4 = 8이됩니다.

8 개의 결과 대신 4 개의 레코드가 있어야한다는 사실은 어떤 종류의 그룹화를 사용하려는 것을 보여줍니다. ProductId에 의해 SteelTubes에 대해 발행 된 내부 쿼리를 그룹화 할 수 있지만 다른 컬럼에는 집계 함수를 사용해야합니다. 원하는 출력의 구조 만 설명 했으므로 의미에 대해서는 설명하지 않았으므로 필요한 집계를 결정하기 위해 내 현재의 지식을 문제에 사용할 수 없습니다.

첫 번째 표의 대답을 찾으면 쉽게 다른 표를 선택 항목에 추가 할 수 있지만 큰 데이터의 경우 크기 조정 문제가 발생할 수 있으므로 이 그룹을 저장하는 테이블, 무언가가 변경 될 때 테이블을 유지 관리하고이 선택에 사용합니다.

관련 문제