2017-11-07 10 views
2

테이블 (tblRecords)에서 선택하고 다른 테이블()에서 반복되는 값을 가진 행을 제외하려고합니다. .다른 테이블의 고유하지 않은 필드에 할당 된 필드가있는 결과 제외

현재 테이블 :

tblRecords:     tblPerson: 
+------------+-------------+ +------------+------------+ 
| CustomerID | OrderID  | | PersonID | UserID  | 
+------------+-------------+ +------------+------------+ 
| 101  |   1 | | 8   | 3004  | 
| 18   |   7 | | 5   | 81   | 
| 8   |   1 | | 19   | 100  | 
| 100  |   2 | | 19   | 101  | 
+------------+-------------+ +------------+------------+ 

원하는 출력 : 시각적 예를 들어

+------------+-------------+ 
| CustomerID | OrderID  | 
+------------+-------------+ 
| 18   |   7 | 
| 8   |   1 | 
+------------+-------------+ 

이 단순화 된 예입니다, 그렇게 나쁘지 테이블 디자인의 징후를 용서하시기 바랍니다. PersonID '19'는 (는) 번에 두 번 이상 표시되므로 모든 결과를 tblRecords에서 제외하고자합니다. CustomerIDUserID과 동일하며 반복되는 숫자는 PersonID입니다. 따라서 100과 101은 제외됩니다.

반복되는 값으로 그룹화하는 대신 해결책은 내 쿼리의 WHERE 절에서 NOT EXISTS을 사용하는 것입니다. 나는 tblRecords에서 결과를 제외 알 수 있도록 CustomerID 값은 다음 반복 PersonID에 나타납니다 곳 쿼리를 해결하는 방법을 이해하지

SELECT * 
FROM tblRecords 
WHERE NOT EXISTS (
    SELECT PersonID 
    FROM tblPeople 
    GROUP BY PersonID 
    HAVING COUNT(PersonID) > 1 
) 

: 여기가 예상대로 작동하지 않는 쓴 쿼리입니다 tblPerson. 현재 하위 쿼리는 내가 제외시키려는 정확한 값을 선택합니다. 나는 그들이 논리적으로 CustomerID에서 어떻게 검색되는지를 모른다.

+0

질문을 편집하고 샘플 데이터와 원하는 결과를 제공하십시오. 당신이 설명에서 하나의 테이블에 대해 말하고있는 것처럼 보이기 때문에 질문은 오히려 비관적이지만, 질의는 두 가지를 언급합니다. –

+0

질문 개선에 대한 정보는 [this] (http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/)를 참조하십시오. – HABO

+0

@GordonLinoff 질문을 다시 작성했습니다. 희망적으로 그것은 더 분명하다. – user7733611

답변

4

당신은 not exists() 쿼리의 where 절에 상관 관계를 추가 할 수 있습니다

select r.CustomerID, r.OrderID 
from dbo.tblRecords r 
where not exists (
    select PersonID 
    from dbo.tblPeople p 
    where p.UserID= r.CustomerID 
     and exists (
     select 1 
     from dbo.tblPeople i 
     where i.PersonID = p.PersonID 
      and i.UserID <> p.UserID 
    ) 
    ) 

rextester 데모 : exists()와 함께 not exists()를 사용하여 업데이트 된 질문에 대한

SELECT * 
FROM ISOW.dbo.tblRecords r 
WHERE NOT EXISTS (
    SELECT PersonID 
    FROM ISOW.dbo.tblPeople p 
    where p.PersonID= r.CustomerID 
    GROUP BY PersonID 
    HAVING COUNT(PersonID) > 1 
) 

: http://rextester.com/DNWK20907

반환 :

+------------+---------+ 
| CustomerID | OrderID | 
+------------+---------+ 
|   18 |  7 | 
|   8 |  1 | 
+------------+---------+ 
+1

30k +1 축하합니다. –

+0

@JuanCarlosOropeza 감사합니다! 네가 너무 멀지 않은 것 같아. – SqlZim

+0

내 질문을 조금 변경했지만 WHERE 절을 추가하면 내 질문에 실제로 대답했습니다. 감사! – user7733611