2013-10-25 4 views
2

SQL Server (T-SQL)에서 매우 간단한 다 대다 테이블 구조 (아래 참조)가 있습니다.단일 쿼리를 사용하여 불일치만을 선택하십시오. (조인 전용)

내가 수행해야합니다

  • 는 표시되지 않습니다 및/또는 삭제 사람과 관련된 모든 작업을 선택 관련된 사람
  • 이없는 모든 작업을 선택
  • 선택 삭제 된 모든 작업.

이 모든 (등, IN/NOT IN, 중첩 된 선택, 조합, 또는 임시 테이블을 사용하지 않고) 결과

이 하나의 조인 만 쿼리에 가능의 단일 테이블을 반환해야합니까?

SCHEMA :

사람

ID 
    IsVisible 
    IsDeleted 

PersonJobs

PersonID 
    JobID 

채용

ID 
    IsDeleted 

각 쿼리를 개별적으로 수행 한 다음 코드에서 데이터 집합을 조인 할 수 있어야하지만 조인을 사용하여이 작업을 수행하는 더 간단한 방법이 있는지 궁금합니다.

정확한 경우 가짜 코드가 응답으로 적합합니다.

감사합니다.

+0

user2864740 불행하게도 그들은 ([인해 매개 변수화 된 쿼리에] 2,100 항목으로 제한됩니다 어떤 UNION 지원 및 IN/NOT IN) C#의 음속에서 모든 제한이야. 나는 이것을 달성하기 위해 SubSonic 인라인 쿼리를 쉽게 작성하거나, 개별적으로 선택하고 조합을 직접 만들 수 있습니다. 그러나 결론에 도달하기 전에 묻습니다. –

+2

* TSQL * 또는 * SubSonic *에 대한 질문입니까? :> 어쨌든,보기를 만드는 것을 고려하십시오 - 모든 "복잡한"것들은 세련된 인터페이스로 빛나는 작은 봉인 된 묶음으로 유지됩니다. – user2864740

답변

0

select j.* 
from personjobs pj 
full join jobs j on pj.jobid = j.id 
full join person p on pj.personid = p.id 
where pj.personid is null 
or p.isdeleted = 1 
or p.isvisible = 0 
or j.isdeleted = 1 
+0

의사와 관련이 없지만 다른 의사와 관련이있는 직업을 얻을 가능성이 있습니까? –

0

CASE 문이 각 원료의 지정 상태의 식별을 위해 사용하십시오. 당신이 그들을 알 필요가없는 경우 단순히 그것을 제거하십시오.

Select J.Id, CASE WHEN PersonVisible Is Null THEN '1 - Not Associated' 
        WHEN PersonVisible = 1 OR PersonDeleted = 1 THEN '2 - Person NotVisible/Deleted' 
        WHEN J.Deleted = 1 THEN '3 - Deleted Jobs' 
      ELSE '4 - All Except above' END as Conditions 
From Jobs J Left Join 
    (Select jobId,IsVisible PersonVisible, IsDeleted PersonDeleted 
    From Person p join PersonJobs pj on p.Id = pj.personId 
    ) X On J.Id = X.jobId 
Order by Conditions 
+0

OP에서 중첩 선택이 유효하지 않다고 언급 한 것 같습니다. 또한 논리는 두 번째 요구 사항 라인에 적합하지 않습니다. "보이지 않거나 삭제 된 사람들과 만 연결된 모든 작업을 선택하십시오."여기서 내가 이해할 수있는 것은 작업에 선택 항목에 포함되어서는 안되는 표시 및/또는 Non_Deleted PersonID가 연관되어있는 경우입니다. 그러나 당신이 올린 질문은 그렇게하지 않을 것입니다. –

관련 문제