2014-02-26 4 views
0

SQL Server 2008 데이터베이스를 사용합니다.테이블 B에없는 테이블 A에서 레코드를 찾는 방법은 무엇입니까?

Table A :

Table B :

request_id|order_id|e-mail 
100  |2563 |[email protected] 
300  |4784 |[email protected] 
600  |9032 |[email protected] 
650  |2578 |[email protected] 
850  |8432 |[email protected] 
012,351,641

request_id|order_id|e-mail 
100  |2567 |[email protected] 
100  |4784 |[email protected] 
450  |2578 |[email protected] 
450  |8432 |[email protected] 
600  |9032 |[email protected] 
600  |9033 |[email protected] 

Table Bidorder_no 열 및 많은 다른 사람의 열이

나는 이와 같은 열 개의 테이블이

당신이 볼 수 있듯이, 테이블 A에 주어진 request_id 번보다 내가 order_id에 의해 테이블 ​​B에 존재하지 않는 테이블 A의 모든 레코드를 찾을 필요가

을 (100 개 & (450) 기록을 참조) 더 발생할 수 있지만, 열 값은 request_id입니다. 이 기준은 기록 어디에 만 만족하면 테이블 B를에없는 표 A의 레코드 위에서 볼 수 있듯이

request_id|order_id|e-mail 
100  |2567 |[email protected] 
100  |4784 |[email protected] 
450  |2578 |[email protected] 
450  |8432 |[email protected] 
600  |9033 |[email protected] 

:

Output : 위의 예를 들어

나는 이런 식으로 뭔가를 기대

select 
    D.request_id, D.order_id 
from 
    table A AS D 
where 
    D.request_id = 600 
    and D.order_id not in (select M.order_id 
          from table B AS M 
          where M.request_id = 600) 
:

order_id=600 나는 T-SQL 쿼리의 스케치를 생성

불행히도 request_id에 대한 내 검색어를 변환하는 방법을 모르겠습니다. 첫 번째 생각은 테이블 A의 모든 request_id에 while 루프를 사용하는 것이지만 SQL 세계에서는 현명하지 않은 것처럼 보입니다.

어떤 도움 주셔서 감사합니다

답변

2

이 시도 -

SELECT a.* 
FROM  table_a a 
LEFT JOIN table_b b ON a.request_id = b.request_id 
        AND a.order_id = b.order_id 
WHERE b.request_id IS NULL 

조립식 - SQL Fiddle

+0

고맙습니다. 현재 실제 예제에서는 테스트 할 수 없지만 제대로 작동하는 것 같습니다. 한 가지 질문 : 마지막 WHERE 조건을 "WHERE b.order_id IS NULL"로 변경합니까? 나는 그것도 작동하고 그것은 나를 위해 더 편안하게 보이기 때문에, 나는 모든 일치하지 않는 request_id를 찾고 싶다. :) – Viper

+0

두 열 ('request_id'와'order_id')이'JOIN' 절에서 사용 되었기 때문에, 너는 그것을 필요로하지 않는다. 그건 같은거야. – AgentSQL

+0

어쩌면 나는 요구 사항을 잘못 이해하고있다.하지만 OP가 request_id에는 테이블 A와 일치하지만 order_id에는 일치하지 않는 모든 레코드가있는 모든 경우를 원한다고 생각했다. 위 쿼리는 테이블 B의 레코드가 request_id 또는 order_id에서 일치하지 않는 테이블 A의 레코드를 나열합니다. – Jay

2
select request_id, order_id from table_a 
except 
select request_id, order_id from table_b 

편집 :이 MS SQL에서 작동하지 않습니다

당신은뿐만 아니라 이메일 주소를 원하는 경우 :

select request_id, order_id, email from table_a 
where (request_id, order_id) not in (
    select request_id, order_id from table_b 
) 
+2

MS SQL에서는 '빼기'대신 'EXCEPT'를 사용해야합니다. 구문은 다른 경우 동일합니다. 두 번째 방법은 T-SQL에서 작동하지 않는다고 생각합니다. 당신은 또한'table_a LEFT JOIN table_b'을 프라이 머리 키에,'WHERE table_b. IS NULL'입니다. –

+0

@BaconBits 두 번째 솔루션의 단서를 이해하지 못합니다. 이 경우 primary_key가 무엇을 의미합니까? request_id입니까? LEFT OUTER JOIN의 IMHO 하나의 조건을 가진 테이블 만 일치시킬 수 있으므로 request_id 및 order_id로 어떻게 일치시킬 수 있습니까? 감사합니다. – Viper

+0

@Viper AgentSQL의 답변은 제가 생각하고있는 것입니다. –

0
SELECT request_id, order_id,e-mail 
    FROM table_a 
    EXCEPT 
    SELECT request_id, order_id,e-mail 
    FROM table_b 
0

난 당신이 의미하는 "하지만 동일한 REQUEST_ID 열 값이"무엇을 모르겠습니다. 뭐라구?

당신은 단순히 다음 일치 REQUEST_ID 및 ORDER_ID와 table_b에 기록이없는 table_a의 모든 레코드하려면 다음

select a.request_id, a.order_id 
from table_a a 
where not exists (select * from table_b b where b.request_id=a.request_id 
    and b.order_id=a.order_id) 
+0

O.P.s 문제 문에도 실패합니다. –

+0

내가 여기에 내 게시물의 시작 부분에서 말했듯이, 나는 OP가 자신의 문제 진술을 명확히해야한다고 생각합니다. 위의 쿼리는 OP 입력이 주어진 예상 출력으로 나열되는 것을 제공합니다. – Jay

-1

오리지널 포스터의 문제 문이 있었다 (내가 인용) :

테이블 B의 모든 레코드는 order_id, 에 있지만 동일한 request_id 열 값을 가져야합니다.

SQL에 대한 문제는 그

  • 집합 이론의 강력한 수학적 토대를 가지고있다, 그리고
  • 술어 미적분

따라서, 영업 이익의 문제 설명이 될 수 있습니다 단순히있는 그대로 거의 표준 SQL 재 작성 :

select *         -- select all rows 
from A a         -- from table A 
where exists (        -- * that have at least one matching 
     select *       -- row in B with the same request ID 
     from B b       -- 
     where b.request_id = a.request_id -- 
    )          -- 
    and not exists (       -- * but have no matching row in B 
     select *       -- with the same 
     from B b       -- request AND order IDs 
     where b.request_id = a.request_id -- 
      and b.order_id = a.order_id  -- 
    )          -- 

쉽지!

+0

반환 값이 예상 출력과 일치합니까? 나는 그렇게 생각하지 않는다. 그의'OUTPUT'을보십시오. – AgentSQL

관련 문제