1

継承したデータベースがあり、SKUのすべての可能なバリエーションを生成するクエリを作成する必要があります。1つのテーブルには「ベース」SKUがあり、もう1つのテーブルにはすべてのSKU修飾子があります。

ベースSKU:MARINは次のように変更できます

MARINR15 MARINB15 MARING15 MARINR17 MARINB17 MARING17 MARINR19 MARINB19 MARING19 MARINR20 MARINB20 MARING20

ベースSKU

ProductID   SKU
----------- ---------------
532         MARIN

SKU修飾子

ProductID   OptionName           OptionValue              SkuModifier
----------- -------------------- ------------------------ -----------
532         Color                Red                      R
532         Color                Green                    G
532         Color                Blue                     B
532         Size                 17"                      17
532         Size                 15"                      15
532         Size                 19"                      19
532         Size                 20"                      20
4

3 に答える 3

3
DROP TABLE #Base
DROP TABLE #Modifiers

CREATE TABLE #Base
(
    ProductId int,
    SKU varchar(32)
)

CREATE TABLE #Modifiers
(
    ProductId int,
    OptionName varchar(32),
    OptionValue varchar(32),
    SKUModifier varchar(32)
)

INSERT INTO #Base
SELECT 532, 'MARIN'

INSERT INTO #Modifiers
SELECT 532, 'Color', 'Red', 'R' UNION ALL
SELECT 532, 'Color', 'Green', 'G' UNION ALL
SELECT 532, 'Color', 'Blue', 'B' UNION ALL
SELECT 532, 'Size', '17"', '17' UNION ALL
SELECT 532, 'Size', '15"', '15' UNION ALL
SELECT 532, 'Size', '19"', '19' UNION ALL
SELECT 532, 'Size', '20"', '20'

SELECT B.SKU + M.SKUModifier + M2.SKUModifier FROM #Base B
    JOIN #Modifiers M ON B.ProductId = M.ProductId AND M.OptionName = 'Color'
    JOIN #Modifiers M2 ON B.ProductId = M2.ProductId AND M2.OptionName = 'Size'

結果:

MARINR17
MARING17
MARINB17
MARINR15
MARING15
MARINB15
MARINR19
MARING19
MARINB19
MARINR20
MARING20
MARINB20
于 2011-11-01T16:53:15.873 に答える
0
SELECT 
  base.sku+color.SkuModifier+size.SkuModifier 
FROM base 
INNER JOIN modifiers as color ON color.OptionName = 'Color'
INNER JOIN modifiers as size ON size.OptionName = 'Size'

おそらくOptionValueを処理する必要があります(たとえば、Sizeから "を削除し、Colorから最初の文字を取得します)が、これにより正しいパスが得られます。

編集-説明をありがとう、私はSQLを更新しました。

于 2011-11-01T16:31:25.387 に答える
0

再帰的なソリューションを使用できます(実際、これがおそらく唯一の実行可能な答えです)。事前に定義された順序があれば、おそらく処理を節約できます(現時点では、これを行うために私が考えることができる唯一の方法はテキストの連結であるためです)。

これがあなたの必要な結果を得るはずの一般的な解決策です。
これはDB2(iSeries)で作成および実行されていることに注意してください。SQLServer用に調整する必要がある場合があります。

WITH Combined(productId, options, combination, level) as (
              SELECT productId, optionName, skuModifier, 1
              FROM #Modifiers
              UNION ALL
              SELECT a.productId, a.options || b.optionName,
                     a.combination || b.skuModifier, a.level + 1
              FROM Combined as a
              JOIN #Modifiers as b
              ON b.productId = a.productId
              AND a.options not like ('%' || b.optionName || '%')),
     Option_Count(productId, count) as (SELECT productId, COUNT(DISTINCT optionName)
                                        FROM #Modifiers
                                        GROUP BY productId)
SELECT a.sku || COALESCE(b.combination, '')
FROM #Base as a
LEFT JOIN (Combined as b
           JOIN Option_Count as c
           ON c.productId = b.productId
           AND c.count = b.level)
ON b.productId = a.productId)

どちらが得られますか:

MARIN17R        
MARIN15R        
MARIN19R        
MARIN20R        
MARIN17G        
MARIN15G        
MARIN19G        
MARIN20G        
MARIN17B        
MARIN15B        
MARIN19B        
MARIN20B        
MARINR17        
MARING17        
MARINB17        
MARINR15        
MARING15        
MARINB15        
MARINR19        
MARING19   
MARINB19   
MARINR20   
MARING20   
MARINB20

個人的には、しかし、私はある種の順序を確立しようと思うと思います-これは少なくともあなたが対処することをノックアウトすることを可能にするでしょうoptionName(その場合、あなたはテーブルをさらに正規化したいかもしれませんが)。
CTEは、結果を「フルレングス」の組み合わせに制限するために使用されていることに注意してくださいOption_Count。これは、一部のオプションだけでなく、すべてのオプションが使用される順列です。

于 2011-11-02T16:16:52.973 に答える