2012-08-24 3 views
0

나는 기타 가게와 함께 갈 웹 사이트가 있습니다.다른 테이블에서 하나의 테이블을 업데이트하고 일치하지 않는 행을 가져 오기

많은 다른 지속적인 문제 중에는 공급 업체의 가격 변경이 있습니다. 따라서 각 가격표를 데이터베이스의 미리 만들어진 테이블에 업로드 한 다음 SKU별로 행을 업데이트하여 공급 업체 가격 목록에 제품을 동기화하려고합니다.

<System.Web.Services.WebMethod()> _ 
Public Shared Function syncPrices(supplierId, tableName) 

    Try 
     Common.changeData("UPDATE " & tableName & " p, products pp SET pp.rrp= p.rrp, pp.cost= p.trade, pp.upc= CASE WHEN p.upc <> '' THEN p.upc ELSE pp.upc END WHERE pp.sku= p.sku AND pp.supplier ='" & supplierId & "'") 
     Return "success|Prices Synced" 
    Catch ex As Exception 
     Return "error|" & ex.ToString 
    End Try 

End Function 
:이처럼 보이는 웹 메소드가

**Products:** 
id | sku | description | cost  .... more fields 


**PriceList_gibson** 
id | sku | description | trade .... more fields 

:

따라서는, 깁슨 기타를 가지고, 나는 테이블 products과 (간체)과 같이 테이블 PriceList_gibson

중요한 SQL 문은 다음과 같습니다.

UPDATE " & tableName & " p, products pp 
    SET 
     pp.rrp= p.rrp, 
     pp.cost= p.trade, 
     pp.upc= CASE WHEN p.upc <> '' THEN p.upc ELSE pp.upc END 
    WHERE pp.sku= p.sku AND pp.supplier ='" & supplierId & "' 

분명히 tableNamesupplierId은이 함수를 호출 할 때 전달되는 변수이며, 어떤 공급 업체의 가격을 결정하고 그에 따라 데이터베이스의 어떤 제품을보고 있는지 결정합니다.

이것은 잘 작동합니다. 제품 테이블의 sku 필드와 공급 업체 가격 목록의 sku 필드가 일치하며 그에 따라 가격 관련 필드가 업데이트됩니다. 또한 사용 가능한 경우 UPC도 업데이트됩니다.

이 처리되지 이가지 경우입니다 : 제품이 중단

  • 경우 항목이 가격표에서 제거 될 때, 더 sku 일치하는 항목이 발견되지 않습니다이 있지만 sku 경우 products 테이블에
  • 을 남아있을 수 있습니다 products 테이블에 잘못 입력 된 경우 일치하지 않습니다.

그래서, 내가 뭘 원하는 products 일치 업데이트되고있는 공급 업체의 가격 목록의에서 supplierId 필드의 항목의 목록을 얻을 수 있지만, 가격 목록에 표시되지 않습니다이다.

물론 레코드를 반복하여이 작업을 수행 할 수 있지만 SQL 문을 사용하여 수행하는 방법은 무엇입니까?

+1

: 같은 데이터 구조를 갖는 여러 테이블에 대한 SQL 안티 패턴입니다. 'PriceList_gibson'과'PriceList_whatever' 대신에'PriceList' 만 가지고 추가 필드를 추가하면됩니다. 그렇다면 동적으로 SQL을 구성 할 필요가 없습니다. ''깁슨 ''은 매개 변수 일뿐입니다. 이것은 또한 실행 계획을 가져올 수 있음을 의미합니다. 그리고 더 신뢰할 수있는 테스트 등 등, – MatBailie

+0

예, 나는 미래에 그것을 바꿀 수도 있습니다, 그것은 장기간에 더 의미가있을 것입니다, 현재 그것은 테이블에 데이터의 업로드를 복잡하게 만들 것입니다. 나는 당신의 요점을 잡는다!:-) –

답변

0

편집 :을 얻으려면 product에 존재하지만 " & tableName & "에 존재하지 않는 행 ...

SELECT 
    * 
FROM 
    product     pp 
LEFT OUTER JOIN 
    " & tableName & "  p 
    ON p.sku= pp.sku 
WHERE 
    pp.supplier = '" & supplierId & "' 
    AND p.sku IS NULL 

또는 ... 여담으로

SELECT 
    * 
FROM 
    product 
WHERE 
    supplier = '" & supplierId & "' 
    AND NOT EXISTS (SELECT * FROM " & tableName & " WHERE sku = product.sku) 
+0

거의, 나는'products'에 존재하는 항목이 필요합니다. 그러나'PriceList_gibson'이 그것을하기 위해 당신의 질의를 수정하려고 시도하지 않았지만, 나는 제대로하지 못합니다! 나는 OUTSQL JOIN이 작동하지 않기 때문에 mySQL도 사용하고있다. –

+0

@JamieHartnoll - 귀하의 의견을 바탕으로 답변이 수정되었습니다. – MatBailie

+0

감사합니다. :-) –

관련 문제