2013-06-29 4 views
2

단순화 이상으로 도움이 필요합니다. 다음과 같은 SQL 문이 있다고 가정 해 보겠습니다.SQL - 다른 레코드가 포함 된 경우이 레코드 포함

SELECT * FROM Policy p 
JOIN OtherPolicyFile o on o.PolicyId = p.PolicyId 
WHERE OtherPolicyFile.Status IN (9,10) 

좋습니다. 또한 Status = 11 인 OtherPolicyFile을 가져올 필요가 있지만, 상태 9 또는 10과 일치하는 OtherPolicyFile이있는 경우에만 해당합니다. 즉

, 나는 보통 상태 (11)와 함께 OtherPolicyFile을 끌어 않겠지 만 해당 정책도 상태 (9) 또는 (10)과 OtherPolicyFile이있는 경우, 나는 또한 11

의 상태로 어떤 OtherPolicyFiles를 당겨야

아마도이 글을 쓰는 쉬운 방법이 있을지 모르겠지만 지금은 풀려 났고 농구를 뛰어 넘지 않고 나에게 다가 가지 않습니다. 어떤 도움을 주시면 감사하겠습니다.

+0

기본적으로 9와 10도 존재하는 경우 상태 11을 얻으려고합니까? –

+0

@RaduGheorghiu 9 살 또는 10 살이라면 11 명이 필요하다고 생각합니다. 토드? – TMS

+0

토마스는 정확합니다 –

답변

3

한 여분의 왼쪽 가입 수행하고 NULL을 위해 왼쪽을 조인 된 테이블을 테스트 : - 추가 LEFT은 '아무튼 가입 있도록 GROUP BY를 사용할 필요가

SELECT p.*, o.* 
FROM Policy p 
    JOIN OtherPolicyFile o on o.PolicyId = p.PolicyId 
    LEFT JOIN OtherPolicyFile o9or10 
     on o9or10.PolicyId = p.PolicyId and o9or10.Status IN (9,10) 
WHERE o.Status IN (9,10) 
    OR o.Status = 11 AND o9or10.PolicyId is NOT NULL 
GROUP BY <whatever key you need> 

을하지만 조심 여기에 바이올린입니다 t 중복 행. 나는 당신의 스키마를 모르기 때문에 적절한 키를 제안 할 수 없으므로 적절한 비밀번호를 기입하십시오 (아마도 OtherPolicyFile의 기본 ID일까요? 그렇다면 귀하의 경우에는 o.ID와 같은 것이 있습니까?) 그러나

+0

감사합니다. 나는 아주 단순한 접근법이 있어야한다는 것을 알고 있었고, 나는 그것에 대해 생각할 수 없었다. 내 마음은 임시 테이블로 모든 것을 읽은 다음 비효율적이며 지나치게 죽이는 것처럼 보였던 것을 다시 보게되었습니다. 당신의 노력에 감사드립니다. –

+0

안녕하십니까? 그렇습니다. 간단한 JOIN으로 대부분의 시간을 얻습니다. 그 (것)들을 능숙하게 결합하기 위하여 – TMS

+0

@Tomas는 나의 대답을 검사한다. 조인하지 않고 실제로 더 잘 수행 –

2

하위 쿼리를 추가하여 9 또는 10이 있는지 확인합니다. http://sqlfiddle.com/#!3/1a68c/2

SELECT * FROM Policy p 
JOIN OtherPolicyFile o on o.PolicyId = p.PolicyId 
WHERE o.Status IN (9,10) 
OR (o.Status = 11 AND 
    exists (select * from OtherPolicyFile innerO 
       where innerO.PolicyId = p.PolicyId 
       and (innerO.Status = 9 or innerO.Status=10))) 
+0

이것은 훌륭한 대답이었고 매우 견고했습니다. 고맙습니다. 다른 응답을 선택한 유일한 이유는 더 효율적으로 보이고 내 "실제"코드에 추가 할 때 덜 복잡하기 때문입니다. –

2

I 최상의 성능을 발휘할 것이라고 믿습니다. 조인 없음을 유의하십시오.

만 2005 +

당신이 '* 선택'작업이 모두 테이블에 동일한 열 이름을 가질 수 있음을주의 SQL 서버에서 실행됩니다. 따라서 필요한 열을 지정해야합니다.

SELECT * from 
(
    SELECT <your columns>, 
    statuscheck = min(nullif(o.status, 11)) over (partition by o.PolicyId) 
    FROM Policy p 
    JOIN OtherPolicyFile o on o.PolicyId = p.PolicyId 
    WHERE o.Status IN (9,10,11) 
) a 
WHERE statuscheck is not null 
+0

조인이 없습니까 ??? 그리고 그곳에있는 "JOIN"은 어떻습니까? – TMS

+0

BTW에서는 하위 쿼리가 대부분 임시 테이블을 만들기 때문에 조인보다 훨씬 비효율적입니다. – TMS

+0

@Tomas 추가 조인이 없으며이 하위 쿼리는 왼쪽 조인보다 효과적입니다. 그것은 기본적으로 9,10,11 모든 행을 선택하고 9와 10없이 그 "파티션"을 거부 –

관련 문제