2012-03-01 4 views
0

내 쿼리에서 문제가 발생했습니다. 서브 SELECT로 해결할 수 있다고 생각합니다.subselect를 사용하여 쿼리를 수행하는 방법

Proposta_Id라는 기본 키가있는 San_Proposta라는 테이블이 있습니다. 이 테이블 (San_Proposta)에는 몇 가지 열이 있지만 특정 열은 StatusProposta_Id라고합니다. StatusProposta_Id는 1 또는 2의 값만 가질 수 있습니다. SanProposta_Id가 1이면 Proposta_Id는 Proposta_Id라는 외래 키가있는 San_Negocio라는 테이블에 존재하지 않습니다. StatusProposta_Id가 2이면 Proposta_Id가 San_Negocio라는 내 테이블에 있습니다.

San_Negocio에서 필자는 몇 가지 열을 가지고 있지만 ValidaVenda와 ValidaCaptacao의 두 열에주의를 기울여야합니다. 두 열은 2 개 값을 가질 수 있습니다 난 단지 하나 개의 쿼리를 수행 할 1 또는 0

을 그

  • 반환하지 San_Negocio에 존재 할 (와 방법이 San_Proposta 경우, 초기 말했다 모든 데이터 .Proposta_Id 후
  • 반환을) San_Negocio에 San_Proposta에 존재하는 모든 데이터가 존재하지 않습니다 1 아니라 San_Proposta.Proposta_Id 2 인 경우 다음) San_Negocio 존재, 초기 말했다 방법 San_Negocio에 존재하는 (그리고
  • 내 테이블 San_Negocio에 San_Proposta.Proposta_Id가있는 경우 (Proposta_Id가 San_Negocio 테이블에 존재하는 경우 San_Proposta.StatusProposta _Id의 값은 2입니다.) San_Negocio.ValidaVenda라는 열에는 San_Negocio.ValidaCaptacao와 같은 값을 사용할 수 없습니다.

어떻게하면됩니까?

나는 추적 쿼리를 tryied하지만

Proposta_Id | StatusProposta_Id 
1    1 
2    1 
3    1 
4    2 
5    2 
6    2 

San_Negocio을 제대로

select 
    San_Proposta.Proposta_Id 
from 
    San_Proposta 
left outer join 
    (
     select 
      * 
     from 
      San_Negocio 
     where 
      Proposta_Id is not null 
      and ValidaCaptacao <> ValidaVenda 
    ) AS Negocio2 
     on San_Proposta.Proposta_Id = Negocio2.Proposta_Id 
where 
    San_Proposta.StatusProposta_Id IN (1,2) 

@Updated 작동

San_Proposta하지 않습니다3210

Proposta_Id | ValidaVenda | ValidaCaptacao 4 1 0 5 0 1 6 1 1 

@Updated

나는 무엇을 기대

Proposta_Id 
1 
2 
3 
4 
5 
내가하고 Proposta_Id 4, 5 (San_Negocio에 존재하지 않기 때문에) 쿼리 Proposta_Id 1,2,3을 반환 할

그들은 San_Negocio에 있지만 ValidaVenda는 ValidaCaptacao와 다르므로 존재합니다.

+1

작동하지 않는 기능은 무엇입니까? 오류나 잘못된 결과가 나옵니까? – rrrr

+0

모든 일러스트 데이터와 예상 결과를 제공하면 누구나 신속하게 조회하여 도움을 줄 수 있습니다. –

+0

@ThitLwinOo 내 게시물을 업데이트했습니다. –

답변

1
select p.* from San_Proposta p 
where p.StatusProposta_Id = 1 

union 

select p.* from San_Proposta p 
    left join San_Negocio n on n.Proposta_Id = p.Proposta_Id 
where p.StatusProposta_Id = 2 
    and n.ValidaCaptacao <> n.ValidaVenda 
+0

그냥 참고하시기 바랍니다. 여기서 "AND"절을 추가하면 LEFT JOIN이 이제는 "REQUIRED"이므로 INNER JOIN이됩니다. 이를 LEFT JOIN으로 유지하려면 조건을 JOIN/ON 절에 보관해야합니다. – DRapp

+0

@ DRapp, 맞습니다. LEFT는이 쿼리에서 실제로 필요하지 않습니다. – jim31415

+0

그래서 왼쪽이 없어도 사용할 수 있습니까? –

0

내용과 관계에 대한 귀하의 생각을 따르려고 노력했지만 매우 어렵습니다. 따라서 귀하의 질문을 다시 생각해 보시기 바랍니다.

편집 : 좋습니다. 업데이트 주셔서 감사합니다.

다음 진술을 사용합니다.

SELECT san_proposta.proposta_id FROM san_proposta WHERE statusproposta_id = 1 
UNION ALL 
SELECT san_proposta.proposta_id FROM san_proposta 
     JOIN san_negocio ON san_proposta.proposta_id = san_negocio.proposta_id 
         AND san_negocio.validacaptacao <> san_negocio.validavenda 
+0

내 게시물을 업데이트했습니다. –

+0

다음 오류가 반환됩니다. 모호한 열 이름 'Proposta_Id'. –

+0

열 이름을 업데이트했습니다. – BitKFu

0

물론, 당신은 당신의 질문에 대한 답을 얻을 수 있도록 영어 번역에 최선을 다했다. 쿼리의 요소를 이해하고 있지만 왜/왜 구체적으로 얻거나 제외하려고하는지 알 수 없습니다. 또한, 왜 하나의 쿼리 내에서 모두. 내가 제공하는 것은 존재하는 또는 존재하지 않는 모든 요소를 ​​가져 오는 쿼리와 나중에 사용할 수있는 또는 사용할 수없는 "플래그"열을 추가 한 쿼리입니다.

요약하면 San_Proposta에서 San_Negocio까지의 공통 ID에 대한 LEFT JOIN은 플래그 열이 1 또는 2인지 여부를 확인하여 레코드가 존재하는지 여부를 식별합니다. 일치하는 항목이 발견되면 상관없이 거짓 플래그 설정이 파일에 있는지 여부와 상관없이 위계적입니다. 거기에서 다른 열의 동일한 상태 코드와 다른 상태 코드의 IF() 한정자를 감지 할 수 있습니다.

select 
     SP.*, 
     CASE WHEN SN.Proposta_ID IS NULL THEN "No" ELSE "Yes" END as FoundInSanNegocio  
    from 
     San_Proposta SP 
     LEFT JOIN San_Negocio SN 
      ON SP.Proposta_ID = SN.Proposta_ID 
    WHERE 
     SN.Proposta_ID IS NULL 
     OR NOT SN.ValidaCaptacao = SN.ValidaVenda 

having 절은 특별히 San_Negocio에서 발견되는 코드를 제외하고 코드는 같은 값입니다.

이제 모든 기록을 스캔하고 모든 상태를 '깃발'열에 표시 할 수 있습니다.

발견되었거나 없습니다 (다시 플래그 열에 대해 중요하지 않습니다. 키가있는 경우 LEFT JOIN에 있음).

"HasSameValidaCode"열이 "해당 사항 없음"(해당 사항 없음)으로 설정되어 있지 않으면 "동일 함"또는 "다름"으로 설정됩니다.

+0

다음 오류 메시지를 반환합니다. 'HasSameValidaCode'열 이름이 잘못되었습니다. –

+0

@Lucas_Santos, 죄송합니다 .SQLServer보다 MySQL에 익숙합니다. NULL을 허용하도록 WHERE 절에서 논리적 OR에 대한 쿼리를 수정했습니다 (즉, 테이블에 일치하는 항목이 없습니다). OR이 발견되었고 열은 서로 동일하지 않습니다. – DRapp

관련 문제