2013-08-23 1 views
3

안녕하세요 저는 의 두 테이블에서 교차하는의 반대쪽을 얻고 싶습니다.복수의 외래 키가있는 내부 조인 (교차)의 역함

판매 테이블과 구매 테이블이 있습니다. 내가 원하는 것은 판매 테이블에 포함되지 않은 모든 구매 ID를 얻는 것입니다.

중인 테이블

sale_id (PK)
PRODUCT_ID (FK)
purchase_id (FK)

구매 테이블

PRODUCT_ID (FK)
purchase_id (PK)

SELECT DISTINCT purchase_id 
       , product_id 
FROM 
    purchase 
INNER JOIN sale 
USING (purchase_id, product_id); 

다음은 예입니다. 위의 코드를 실행하면 결과가됩니다.

purchase_id product id 
1    1 
1    2 
1    4 
2    1 
2    3 

는 지금은하고 싶지 : 한마디로

purchase_id product id 
1    3 
2    2 

내가 위의 코드의 역을 싶어. 미리 감사드립니다.

+0

의도 한 출력에 {purchase_id = 2, product_id = 4}도 포함될 수 있습니다. – wildplasser

답변

1

좋아 모두 함께 넣어, 나는 지금보다 나은 이해 생각한다.

판매에서 일치하는 항목이없는 구매 항목을 반환해야합니다.

SELECT 
    `purchase`.`purchase_id`, `purchase`.`product_id` 
FROM `purchase` 
    LEFT JOIN `sale` ON `sale`.`purchase_id` = `purchase`.`purchase_id` AND `sale`.`product_id` = `purchase`.`product_id` 
WHERE 
    `sale`.`sale_id` IS NULL 
ORDER BY 
    `purchase`.`purchase_id`, `purchase`.`product_id` 
+0

예, 이것은 저에게 역을 줄 것입니다. 그러나 문제는 구입 테이블에없는이 반환 값입니다. 예를 들어 purchase_id 1에는 4 개의 제품 (1,2,3,4) 만 있습니다. (pur1, pro6), (pur1, pro9) .... – MS48

+0

@ ms48mail 나는 그것이 당신이 원하는 것이라고 생각했습니다. 귀하의 게시물에 1-1, 1-2, 1-4 테이블에 있지만 1-3을 반환 2-1, 2-3 2-3을 반환 언급. 여기 논리는 무엇입니까? product_id가 해당 구매에 대해 판매 된 최대 product_id보다 작은 누락 된 모든 제품처럼 보입니까? – ESG

+0

나쁜 영어로 죄송합니다. 내가 실제로 원했던 것은 판매를하기 위해 개입하지 않은 곳에서 모든 구매 번호와 제품 번호를 얻는 것이 었습니다. 그러나 당신의보기는 저에게 구입과 관련없는 제품 ID를주었습니다. 이 구입 (pur1, pro1), (pur1, pro3) 및 판매 (pur1, pro1). 지금 나는 얻고 싶다 (pur1, pro3). 그러나 당신의 본보기는 저를주었습니다 (pur1, pur2). 당신이 이해하기를 바랍니다. – MS48

0

당신은 판매 테이블에 관련된 값이없는 모든 구매를 얻고 싶은 경우에, 당신은 사용할 수있는 LEFT JOIN :

select 
    p.purchase_id 
from 
    purchase as p 
    left join sale as s on p.purchase_id = s.purchase_id 
where 
    s.purchase_id is null; 

"일방적는"당신이 할 때 (LEFT JOIN, RIGHT JOIN)이 유용 조인 다른 관련 테이블의 데이터가없는 경우에도 테이블에서 데이터를 가져옵니다. 물론 두 번째 테이블에 관련 데이터가없는 경우 한 테이블에서 데이터를 필터링 할 수 있습니다.

희망이 도움이됩니다.


업데이트 된 질문과 의견을 보면 모든 가능한 조합을 사용하지 않기를 바랍니다. 당신은 두 단계로이 분할해야합니다

:

  1. 먼저 당신은 purchase_idsale_id 값 (이하 "직교 제품"세트 모두)의 모든 가능한 조합이 필요합니다.
  2. 그러면 이미 사용 된 모든 조합을 가져와야합니다.
  3. 마지막으로 이미 사용 된 모든 조합을 제외해야합니다.

하위 쿼리를 사용하여 수행 할 수 있습니다.

단계 1.

select distinct p.purchase_id, s.product_id from purchase as p, sale as s; 

2 단계. (질문)

select distinct 
    purchase_id, product_id 
from 
    purchase as p 
    inner join sale as s 
     on (p.purchase_id = s.purchase_id and p.product_id = s.product_id); 

3 단계

select 
    a.* 
from 
    (select distinct p.purchase_id, s.product_id from purchase as p, sale as s) as a 
    left join (
     select distinct 
      purchase_id, product_id 
     from 
      purchase as p 
      inner join sale as s 
       on (p.purchase_id = s.purchase_id and p.product_id = s.product_id) 
    ) as e on (a.purchase_id = e.purchase_id and a.product_id = e.product_id) 
where 
    e.purchase_id is null and e.product_id is null; 
+0

빠른 답장을 보내 주셔서 감사합니다. 나는 이미이 방법을 시도했다. 구매 ID 전체를 무시합니다. 예를 들어 판매 구매 ID = 1 제품 = 1을 사용하고 구매 ID = 1 제품 ID = 4를 사용하지 않은 경우 두 번째 ID도 = 생략 할 수 있습니다. – MS48

+0

@ ms48mail 답을 업데이트했습니다 ... 이제 도움이 될 것 같습니다. – Barranka

+0

안녕하세요. 그러나 이것은 구매 테이블이나 판매 테이블에서 코드를 다시 사용하지 못하게합니다. 예를 들어. 그것은 나에게 purchase_id = 1 및 product_id = 6, purchase_id = 1 및 product_id = 7을주었습니다. – MS48