2009-03-18 6 views
3

나는 다음과 같은 테이블이 있다고 가정하자 :지도 테이블에 포함되지 않은 두 테이블에서 값을 선택하는 방법은 무엇입니까?

  • 고객
  • 제품
  • CustomerProducts

나는 고객과 제품 테이블 값에서 선택을 할 수있는 방법이 있나요 지도 테이블에 없습니까? 기본적으로 소유하지 않은 고객 및 제품의 일치 목록이 필요합니다.

또 하나의 트위스트 : 제품마다 고객 한 명을 연결해야합니다. 따라서 5 명의 고객이 제품 A를 갖고 있지 않은 경우 쿼리의 첫 번째 고객 만 제품 A를 가져야합니다. 결과는 다음과 같습니다.

(모든 고객이 제품 B를 소유하고 한 명 이상의 고객이 소유하고 있다고 가정합니다. 제품 A, C 및 D)

  1. 고객 1, 부산물
  2. 고객 2, 제품 C
  3. 고객 3, 제품 D

최종 트위스트 :이 쿼리를 실행해야합니다 같이 SQL Sever에서 UPDATE 문의 부분. 그래서 첫 번째 행에서 값을 취할 필요 :

고객 1, 부산물

UPDATE Customers 
SET Customers.UnownedProduct = ProductA 
WHERE Customers.CustomerID = Customer1ID 

처럼 뭔가 고객 레코드를 업데이트하지만이 작업을 수행 할 수 있다면 좋을 것이다 하나의 SQL 문에서 전체 프로세스. 따라서 쿼리를 한 번 실행하면 1 명의 고객이 소유하지 않은 제품으로 업데이트됩니다. 그게 너에게 너무 혼란스럽지 않길 바래! 미리 감사드립니다!

+0

두 명의 고객과 한 개의 prdouct가 있고 둘 다 소유하지 않으면 어떻게됩니까? –

+0

그런 다음 쿼리는 첫 번째 고객과 함께 단 하나의 레코드 만 반환해야합니다. –

답변

3
WITH q AS 
     (
     SELECT c.*, p.id AS Unowned, 
       ROW_NUMBER() OVER (PARTITION BY p.id ORDER BY c.id) AS rn 
     FROM Customers c 
     CROSS JOIN 
       Products p 
     LEFT JOIN 
       CustomerProducts cp 
     ON  cp.customer = c.id 
       AND cp.product = p.id 
     WHERE cp.customer IS NULL 
     ) 
UPDATE q 
SET  UnownedProduct = Unowned 
WHERE rn = 1 

UPDATE 문은 특정 제품을 소유하지 않은 고객을 업데이트합니다. 당신은 한 번에 하나의 고객을 업데이트하는 경우 (CustomerProducts에서) 자동으로 할당 된 어떤 제품을 기억해야합니다,

SELECT * 
FROM (
     SELECT c.*, p.id AS Unowned, 
       ROW_NUMBER() OVER (PARTITION BY p.id ORDER BY c.id) AS rn 
     FROM Customers c 
     CROSS JOIN 
       Products p 
     LEFT JOIN 
       CustomerProducts cp 
     ON  cp.customer = c.id 
       AND cp.product = p.id 
     WHERE cp.customer IS NULL 
    ) cpo 
WHERE rn = 1 
+0

이것은 OP의 또 다른 그리고 마지막 강선전도를 고려하지 않습니다! –

+0

두 계정 모두 고려해야합니다. – Quassnoi

+0

+1. 나는 따라 잡아야한다. –

0

또는이 : 당신이 목록을 선택합니다

, 다음이 필요합니다 제품이 (제품에) 자동으로 할당 된 횟수 카운터

0

나는 (너무 당신을 위해 일하는 희망)

UPDATE customers c 
    SET unownedProduct = 
     (SELECT MIN(productid) 
      FROM products 
      WHERE productid NOT IN (
       SELECT unownedProduct 
       FROM customers 
       WHERE unownedProduct IS NOT NULL) 
      AND productid NOT IN (
       SELECT productid 
       FROM customerProducts cp 
       WHERE cp.customerId = c.customerid) 
     ) 
WHERE customerId = 1 
0

무엇 용돈이 경우 오라클이 시도 stomer는 하나 이상의 제품을 소유하고 있지 않습니까? 데이터 변경에 따라이 필드를 어떻게 유지할 것입니까? 나는 고객 테이블에이 정보를 저장하는 것이 의미가 없으므로 데이터 구조에 대해 좀 더 생각할 필요가 있다고 생각합니다.