2017-10-30 3 views
1

다른 필드로 표시된 항목을 골라 내고 싶은 테이블이있는 쿼리에 문제가 있습니다.하나의 테이블에 중첩 된 쿼리

특히, 다른 위치에서 이동하고 표시 한 컨베이어 상자.

다음은 내가 가지고있는 것입니다 (그것은 작동하지 않습니다 - 오류를 일으키는 내부 선택 절의 여러 레코드를 반환합니다).

필드 바코드는 고유하지 않습니다. 그것이 작동하도록되어있는 방식은 돌아 다니며 특정 영역을 지나갈 때마다 해당 바코드에 새로운 레코드가 추가됩니다. 나는 그들 중 하나와 함께 3 개의 다른 영역에 있었던 바코드를 찾으려고합니다. lane_id LIKE (CRANE % _IN)

내 오류는 논리적 인 것으로 알고 있지만, 하위 쿼리가있는 동일한 테이블

개념 (나는 2 분 안에 어떤 언어로도 할 수있다)만큼 쉽게 SQL (포스트 그레스)에서 할 필요가있다.

SELECT barcode, lane_id 
FROM acts_divert_log 
WHERE lane_id IN ('GTP01', 'GTP02', 'GTP03', 'GTP04') 
AND divstat IN (0, 1) 
AND barcode = 
(
    SELECT barcode FROM acts_divert_log WHERE 
    lane_id LIKE ('CRANE%_IN') 
    AND divstat IN (0, 1) 
    AND barcode = 
    (
     SELECT barcode FROM acts_divert_log WHERE 
     lane_id IN ('GTP01', 'GTP02', 'GTP03', 'GTP04') 
     AND divstat IN (0, 1) 
    ) 
); 

예상 결과는 GTP0 %의 영역 및 적어도 하나의 크레인 %에 유념하라 영역 2에서 볼 수있다 바코드 고유해야한다.

도움이나 힌트를 주시면 감사하겠습니다. SQL은 정말로 나의 장점이 아닙니다. 이 같은

+0

GTP0 % 영역 중 2 개에서 볼 수있는 두 개의 별개 영역? 그러나 테이블 정의와 Postgres 버전, 그러한 질문에 대한 기본 요구 사항을 제공함으로써 시작하십시오. –

+0

예, 두 개로 구분됩니다. – DenizC

답변

0

. 이를 해결할 수있는 방법은 여러 가지가 있습니다. 하나의 간단하고 빠른 방법은 :

SELECT barcode 
    , a1.lane_id AS lane_id1 
    , a2.lane_id AS lane_id2 
    , a3.lane_id AS lane_id3 
FROM acts_divert_log a1 
JOIN acts_divert_log a2 USING (barcode) 
JOIN acts_divert_log a3 USING (barcode) 
WHERE a1.lane_id IN ('GTP01', 'GTP02', 'GTP03', 'GTP04') 
AND a2.lane_id IN ('GTP01', 'GTP02', 'GTP03', 'GTP04') 
AND a3.lane_id LIKE 'CRANE%_IN' 
AND a1.divstat IN (0, 1) 
AND a2.divstat IN (0, 1) 
AND a3.divstat IN (0, 1) 
AND a1.lane_id <> a2.lane_id; -- assuming you want distinct lane_ids 

우리는 조립이 관련 질문에서 기술의 무기 :

당신은 일치 할 필요 인덱스가 빠른이를 만들기 위해. 세부 정보는 테이블 정의, 데이터 배포, 카디널리티 등에 대한 정보에 따라 달라집니다.

+0

a2.lane_id 대신 a3.lane_id의 작은 오타를 제외하고는 아름답게 작동했다. 고맙다. – DenizC

0

시도 뭔가 : 그것은 관계 부문의 사건

SELECT barcode, lane_id 
FROM acts_divert_log l 
WHERE divstat IN (0, 1) 
AND EXISTS (
    SELECT barcode 
    FROM acts_divert_log t2 
    WHERE divstat IN (0, 1) 
    AND l.barcode = t2.barcode 
    GROUP BY t2.barcode 
    HAVING 
    SUM(CASE WHEN lane_id IN ('GTP01', 'GTP02', 'GTP03', 'GTP04') THEN 1 ELSE 0 END) >= 2 
    AND SUM(CASE WHEN lane_id LIKE ('CRANE%_IN') THEN 1 ELSE 0 END) >= 1 
) 
; 
+0

취소해야했는데 너무 오래 걸렸습니다. 나는 테이블에 약 600 만 개의 엔트리가 있다고 언급해야한다. – DenizC

0
Select distinct Barcode, lane_id from acts_divert_log 
Where Barcode in (
Select barcode from (
Select Barcode, sum(cnt_gtp) as gto 
, sum(cnt_crane) as crane 
from (Select Barcode 
, case when (lane_id in ('GTP01' , 'GTP02', 'GTP03', 'GTP04')) 
    Then 1 else 0 end as cnt_gtp, 
, case when (lane_id like 'CRANE%_IN') then 1 else 0 end as cnt_crane 
from acts_divert_log 
Where divstat in (0,1) 
and ((lane_id in ('GTP01' , 'GTP02', 'GTP03', 'GTP04')) 
    OR (lane_id like 'CRANE%_IN')) 
) as aa 
     Group by barcode 
) as bb 
Where gtp>=2 and crane>=1 
)