2010-04-29 3 views
1

고객 ID와 주문이라는 두 개의 열이있는 테이블이 있습니다. 당신은 그 3245 고객 위에서 볼 수SELECT 문에서 누락 된 값을 채우십시오.

1234 1 
    1234 2 
    1234 3 
    1234 4 
    3245 3 
    3245 4 
    5436 2 
    5436 4 

하지 않습니다 의 내가 총 주문 ID를

모든 4 개 개의 모든 주문, 아래와 같이를 가질 수 있습니다 고객이 1,2,3,4에 있다고 가정 해 봅시다 내가 주문 테이블을 가지고 있지 않지만, 우리가 열심히 그것을 코딩 할 수처럼 순서의 목록이 있습니다

3245 1 
3245 2 
5436 1 
5436 3 

편집 : 어떻게 같은 쿼리 출력에 인쇄 할 수있는 주문 ID 1 또는 2 이 쿼리 (1,2,3,4). 당신이 customers 테이블이있는 경우

+0

그래서 당신이 실제로 찾고있는 것은 GAPS (즉 : 주어진하지 않아도 그 주문 번호). 모든 고객이 가져야 할 주문 번호의 마스터 목록이 있습니까? 바로 소리하지 않습니다. 한 고객이 한 번에 올 경우 다른 고객이 100 번 이상 올 경우 모든 고객이 100 + 주문을 기대하지 않으므로 – DRapp

+0

이러한 주문과 연결되지 않은 고객을 보려고하십니까? –

+0

여기 max에서 한 고객은 단 4 명의 주문 만 할 수 있으며 한 고객이 두 번 주문하지 않습니다. – Vijay

답변

3
SELECT c.id, o.order 
FROM (
     SELECT 1 AS order 
     UNION ALL 
     SELECT 2 AS order 
     UNION ALL 
     SELECT 3 AS order 
     UNION ALL 
     SELECT 4 AS order 
     ) o 
CROSS JOIN 
     (
     SELECT DISTINCT id 
     FROM customer_orders 
     ) c 
WHERE NOT EXISTS 
     ( 
     SELECT NULL 
     FROM customer_orders ci 
     WHERE ci.id = c.id 
       AND ci.order = o.order 
     ) 

, 그것은 더 간단하게 ...

SELECT c.id, o.order 
FROM (
     SELECT 1 AS order 
     UNION ALL 
     SELECT 2 AS order 
     UNION ALL 
     SELECT 3 AS order 
     UNION ALL 
     SELECT 4 AS order 
     ) o 
CROSS JOIN 
     customers c 
WHERE NOT EXISTS 
     ( 
     SELECT NULL 
     FROM customer_orders ci 
     WHERE ci.id = c.id 
       AND ci.order = o.order 
     ) 
+0

Excellent.This 정확히 내가 필요한 것입니다 .BWW 예상되는 출력을 받고 있지만 쿼리의 부분을 plase 수 plat 수 있습니다? – Vijay

+0

@benjamin : 'CROSS JOIN'을 사용하여 가능한 모든 고객/주문 조합을 작성한 다음 'NOT EXISTS'로 필터링하여 'customer_orders'에 일치하는 항목 만 반환합니다. – Quassnoi

0
내 댓글에서 제외

하고 기존 테이블, 나는 이런 식으로 뭔가를 접근 할

select distinct 
     a.Customer, 
     b.OrderNumber 
    from 
     YourOrderTable a, 
     (select distinct OrderNumber from YourOrderTable) b 
    where 
     b.OrderNumber NOT IN 
      (select OrderNumber from 
       YourOrderTable c 
       where a.Customer = c.Customer 
        and b.OrderNumber = c.OrderNumber) 

FROM 절의 두 번째 테이블로 select distinct를 수행하고 특정 조인을하지 않으면 Cartesian 조인을 얻을 수 있습니다. 즉, 각 고객에 대해 가능한 모든 der number.

그런 다음 WHERE 절에서 NOT IN SQL 테스트는 "b"만을 허용합니다. 아무도는 SQL-부속 선택에 존재하지 않는 주문 번호 (다.)를

이 .. 당신이 많은 독특한 주문이 특히

+0

나는 단지 4 개의 주문을 가지고있다. 그것은 값 비싼 것이 아니다. – Vijay

1

좋아 매우 비용이 많이 드는 쿼리 수, 여기에 두 가지 문제가있다. 첫 번째 문제는 숫자 목록을 행 집합으로 변환하는 것입니다. 숫자를 쿼리에 입력하는 방법에 따라 여러 가지 방법이 있습니다. 다음 예제에서는 쉼표로 구분 된 문자열을 TABLE() 함수를 사용하여 일반 테이블로 처리 할 수있는 중첩 테이블로 변환하는 함수를 사용합니다. 이것은 당신이 제기하는 질문에 엄격히 관련이 없습니다. 이 구현에 관심이 있으시면 my post in this other thread을 참조하십시오.

문제의 두 번째 부분은 각 고객의 누락 주문을 식별하는 것입니다. 하위 쿼리와 함께 NOT IN을 사용하는 것과 같은 명백한 접근 방식은 고객 주문 1234가 모든 주문 ID와 일치하기 때문에 작동하지 않습니다. 고객별로 누락 된 주문을 채우기 만하면됩니다. PARTITION BY 절과 결합 된 LEFT OUTER JOIN을 사용하여이를 수행 할 수 있습니다. 다음과 같이 외부 SELECT에 LOJ 쿼리를 삽입하여 히트를 필터링 할 수있는 간단한 문제이다 :

SQL> select customer_id 
    2   , missing_order_id 
    3 from (
    4  select t42.customer_id 
    5    , t42.order_id 
    6    , nos.column_value as missing_order_id 
    7  from (select * from table (str_to_number_tokens('1,2,3,4'))) nos 
    8  left outer join t42 partition by (t42.customer_id) 
    9  on nos.column_value = t42.order_id 
10  ) 
11 where order_id is null 
12/

CUSTOMER_ID MISSING_ORDER_ID 
----------- ---------------- 
     3245    1 
     3245    2 
     5436    1 
     5436    3 

SQL> 
관련 문제