2013-04-11 5 views
0

Product 레코드와 Model 레코드가있는 테이블이 있습니다. 제품 및 모델 레코드는 모두 QTYSize 열입니다. 주어진 product_id를 들어, 나는 Model 기록에서 모든 qtyssizes을 잡은의 단일 * qty and size 필드에 배치하고 싶은 ** 부모Product 기록, 파이프 "|"로 구분. 여기에 지금까지 가지고있는 SQL이 있습니다. 주어진 product_id에 대한 모델 레코드의 크기 및 qty 값을 성공적으로 가져 왔지만 부모 제품 레코드 필드를 업데이트 할 수 없어 재귀 적으로 수행합니다. 누군가 나에게 손을 줄 수 있습니까? 들으재귀 통합 병합

이 예는 PRODUCT_ID '26206'

--declare local variables 
DECLARE 
     @size_DelimitedString VARCHAR(MAX), 
     @qty_DelimitedString VARCHAR(MAX) 

--pivot rows into delimited string 
SELECT 
     @size_DelimitedString = COALESCE(@size_DelimitedString, '') + CONVERT(VARCHAR(10), [BD New Product Data].model_size) + '|' 
FROM 
     [BD New Product Data] 
     where record_type = 'model' and product_id = '26206' 

SELECT 
     @qty_DelimitedString = COALESCE(@qty_DelimitedString, '') + CONVERT(VARCHAR(10), [BD New Product Data].model_quantity) + '|' 
FROM 
     [BD New Product Data] 
     where record_type = 'model' and product_id = '26206' 

--trim off last pipe 
SET @size_DelimitedString = (SELECT SUBSTRING(@size_DelimitedString, 1, LEN(@size_DelimitedString)-1)) 
SET @qty_DelimitedString = (SELECT SUBSTRING(@qty_DelimitedString, 1, LEN(@qty_DelimitedString)-1)) 

--show results 
SELECT @size_DelimitedString 
SELECT @qty_DelimitedString 
+0

어떤 RDBMS와 버전을 사용? 오라클은 버전 10g 또는 그 이전 버전에서 이것을 쉽게 수행 할 수있는 WM_CONCAT과 여러 행을 1 개로 결합하여 재귀 부분을 제거하는 LIST_AGG 또는 XML_AGG를 지원합니다. 내 생각에 SQL Server는 XML 경로를 사용합니다. 조금 더 복잡하지만 작동합니다 (예 : http://stackoverflow.com/questions/12559551/sql-server-equivalent-of-wm-concat-function) – xQbert

+0

MS SQL 2012.Microsoft SQL Server Management Studio \t을 사용하고 있습니다. \t \t \t \t \t 11.0.2100.60 Microsoft 데이터 액세스 구성 요소 (MDAC) \t \t \t \t \t \t 6.1.7601.17514 마이크로 소프트 MSXML \t \t \t \t \t \t 3.0 4.0 5.0 6.0 마이크로 소프트 인터넷 익스플로러 \t \t \t \t \t \t 9.10.9200.16540 마이크로 소프트 .NET 프레임 워크 \t \t \t \t \t \t 4.0.30319.296 운영 체제 \t \t \t \t \t \t 6.1.7601 – user2268505

+0

없음 압력은 전혀 없지만 http://meta.stackexchange.com/questions/10672/encourage-users-to-select-accepted-answer-for-old-quest 이온/10690 # 10690. :) – bob

답변

0
SELECT 
    product_id 
, STUFF((
    SELECT '|' + CONVERT(VARCHAR(10), A.model_size) 
    FROM [BD New Product Data] A 
    WHERE A.record_type = 'model' AND A.product_id = T.product_id 
    FOR XML PATH(''), TYPE 
    ).value('.', 'VARCHAR(MAX)'), 1, 1, '') AS product_sizes 
, STUFF((
    SELECT '|' + CONVERT(VARCHAR(10), A.model_quantity) 
    FROM [BD New Product Data] A 
    WHERE A.record_type = 'model' AND A.product_id = T.product_id 
    FOR XML PATH(''), TYPE 
    ).value('.', 'VARCHAR(MAX)'), 1, 1, '') AS product_quantities 
FROM [BD New Product Data] T 
WHERE T.record_type = 'product' 
--AND T.product_id = '26206' 
+0

이것은 아주 좋습니다! 고마워. 그렇다면 제품 레코드의 qty 및 size 필드를 업데이트하기 위해 어떻게 업데이트 문을 작성해야합니까? – user2268505

+0

설명이 부족해서 죄송합니다. 시간이 촉박했습니다. T-SQL이 WM_CONCAT과 같은 집계 함수를 제공하지 않는 이유는 누가 알겠는가? 다행스럽게도'FOR XML PATH ('')는 동일한 것을 수행하는 데 사용될 수 있습니다. 따라서 XML을 사용하여 연결된 문자열을 생성 한 다음 STUFF()를 사용하여 여는 파이프를 제거하고 마지막 문자열을 반환합니다. 수량 및 크기 필드를 업데이트하려면 'BD 신제품 데이터'에서 product_quantity = STUFF (...)를 선택하고 'UPDATE'에서 'UPDATE T SET product_size = STUFF (...)로 변경하십시오. 어디 T.record_type = 'product''. – bob

+0

마지막 위치에서 누락 된 부분은 무엇입니까? 업데이트 T 설정 T.size = 다도 (( SELECT '|'. + CONVERT (VARCHAR (10), A.model_size) [DBO] FROM [BD 새로운 제품 데이터 테스트]는 WHERE A.record_type = ('.', 'VARCHAR (MAX)'), 1, 1 '') , T.(BD 신제품 데이터 테스트) A WHERE A.record_type = 'model'AND A.product_id = qty = STUFF (( SELECT '|'+ CONVERT (VARCHAR (10), A.model_quantity) FROM [dbo]. ('.', 'VARCHAR (MAX)'), 1, 1 '') FROM [dbo]. [BD 활성 테스트] T WHERE T.sku = A.product_id – user2268505

0
USE Prod 
Update dbo.[BD Active Test] 
Set dbo.[BD Active Test].size = STUFF((
    SELECT '|' + CONVERT(VARCHAR(10), [dbo].[BD New Product Data Test].model_size) 
    FROM [dbo].[BD New Product Data Test] 
    WHERE [dbo].[BD New Product Data Test].record_type = 'model' AND [dbo].[BD New Product Data Test].product_id = dbo.[BD Active Test].sku 
    FOR XML PATH(''), TYPE 
    ).value('.', 'VARCHAR(MAX)'), 1, 1, '') 
, dbo.[BD Active Test].qty = STUFF((
    SELECT '|' + CONVERT(VARCHAR(10), [dbo].[BD New Product Data Test].model_quantity) 
    FROM [dbo].[BD New Product Data Test] 
    WHERE [dbo].[BD New Product Data Test].record_type = 'model' AND [dbo].[BD New Product Data Test].product_id = dbo.[BD Active Test].sku 
    FOR XML PATH(''), TYPE 
    ).value('.', 'VARCHAR(MAX)'), 1, 1, '') 
from dbo.[BD Active Test] 
INNER JOIN dbo.[BD New Product Data Test] ON dbo.[BD Active Test].sku = dbo.[BD New Product Data Test].product_id 
where dbo.[BD New Product Data Test].record_type = 'PRODUCT' 
+0

입니다.이 '[BD Active Test]'테이블과 'sku' 원래 게시물의 열? 귀하의 문제에 대한 해결책의 관점에서,이 답변은 내 대답과 동일하게 보입니다. – bob

+0

나는 다른 테이블을 업데이트하고 있다는 사실을 잊어 버렸습니다. 이 일을 .. 도와 줘서 고마워. – user2268505