2016-04-13 7 views
0

私はオラクルのバックグラウンドから来ています。このサイトで検索を実行すると、FOR XML PATHを使用してLISTAGG()がOracleで行うことを複製しようとする方法に関する無数の例が見つかりました。しかし、私がやろうとしていることがその範囲外であるか、私は何が欠けているのか分かりません。私が見つけたすべての例では、単一のキーIDを使用しています。私の場合、複数のテーブルからの結合を使用する必要があります。FOR XMLディレンマを使用したSQL Serverの連結

テーブルの見た目のレイアウトは次のとおりです。

CREATE TABLE driven_product 
([PRODUCT_ID] int, [DRIVER_ID] int, [DRIVER_PRODUCT_INPUT_NUM] int); 

INSERT INTO driven_product 
([PRODUCT_ID], [DRIVER_ID], [DRIVER_PRODUCT_INPUT_NUM]) 
VALUES (1, 2, 3); 

CREATE TABLE product_input 
([PRODUCT_ID] int, [PRODUCT_INPUT_NUM] int, [PRODUCT_VALUE_NUM] int, [COLOR] VARCHAR (50)); 

INSERT INTO product_input 
([PRODUCT_ID], [PRODUCT_INPUT_NUM], [PRODUCT_VALUE_NUM], [COLOR]) 
VALUES 
    (1, 3, 1, 'White'), 
    (1, 3, 2, 'Blue'), 
    (1, 3, 3, 'Green'), 
    (1, 3, 4, 'Yellow'), 
    (1, 3, 5, 'Orange'); 

CREATE TABLE driven_price 
[PRODUCT_ID] int, [DRIVER_ID] int, [PRODUCT_VALUE_NUM] int, [PRICE] int); 

INSERT INTO driven_price 
([PRODUCT_ID], [DRIVER_ID], [PRODUCT_VALUE_NUM], [PRICE]) 
VALUES 
    (1, 2, 1, 10), 
    (1, 2, 2, 10), 
    (1, 2, 3, 10), 
    (1, 2, 4, 20), 
    (1, 2, 5, 20); 

driven_productテーブルはdriven_product.product_id = product_input.product_id AND driven_product.driver_product_input_num = product_input.product_input_numを使用してproduct_inputテーブルに結合します。 driven_priceテーブルは、 driven_product.product_id = driven_price.product_id、driven_product.driver_id = driven_price.driver_id、およびproduct_input.product_value_num = driven_product.product_value_numを使用して結合されます。

私が得ている最も近いです:

SELECT STUFF((SELECT '/' + color 
       FROM product_input pi 
       WHERE pi.product_id = dp.product_id 
       AND pi.product_input_num = dp.product_input_num 
       FOR XML PATH('')), 1, 1, ''), dpr.price 
FROM driven_product dp 
INNER JOIN driven_price dpr ON dp.product_id = dpr.product_id 
AND dp.driven_id = dpr.driven_id 

これは、それぞれの価格にすべての色を組み合わせています。

ここで明白なことは、product_input.product_value_numをdriven_price.product_value_numに参加させないことです。私がそれをするとき、それは各色をそれ自身の行に分ける。

これは私が苦労しているところで、私はそれを価格で行う必要があるということです。だから、私は "白、青、緑"と "黄色、オレンジ"を分ける必要があります。

これをSQLFiddleで設定しようとしましたが、エラーが発生しました。あなたが提供できるガイダンスは高く評価されます。

答えて

1

あなたはgroup by or distinct ..を使用できますが、主な問題はFOR XMLクエリをPRICEでフィルタリングしていなかったことです。すべての色を取得しています。

SELECT DISTINCT 
     Products = STUFF((
       SELECT '/' + color 
       FROM driven_price dp2 
         JOIN product_input pi ON dp2.Product_Value_Num = PI.Product_Value_Num 
       WHERE dp2.driver_id = dpr.driver_id AND dp2.Price = dp.Price 
       FOR XML PATH('')), 1, 1, ''), 
     dp.[Price] 
FROM driven_product dpr 
     JOIN product_input pri ON dpr.Driver_product_input_num = pri.PRODUCT_INPUT_NUM 
     JOIN driven_price dp ON pri.product_id = dp.product_id 
      AND pri.product_value_num = dp.product_value_num 
0

外部クエリに集計が必要です。私は、これはあなたがやりたいだろうと思います

SELECT dpr.price, 
     (SELECT '/' + pi.color 
     FROM product_input pi join 
      driven_product dp INNER JOIN 
      ON pi.product_id = dp.product_id AND 
       pi.product_input_num = dp.product_input_num 
     WHERE dp.product_id = dpr.product_id 
     FOR XML PATH('')) 
     ) 
FROM driven_price dpr 
GROUP BY dpr.price; 

注:あなたが唯一の中置区切りを処理するためにstuff()を必要としています。あなたが "/青/緑/赤"に満足しているなら、あなたはそれを必要としません。 stuff()の目的は、先頭の区切りを削除することで、 "青、緑、赤"は "青、緑、赤"になります。

+0

は通常、あなたの答え氏Linoffを愛し、私はすべてで働いていることを確認することはできません。.. :( 毎回私は私が '間違ってはsyntaxエラーを取得するだけでなく、それを実行しよう。 限り、それを変更します私ができるように、両方の価格のすべての色を返すという問題を取り戻します。 – Shaneis

関連する問題