34

次の構造のテーブルがあります

テーブル名:matches

テーブル名: マッチ

それは基本的に、どの製品がどの製品と一致しているかを保存します。このテーブルを処理し、以下のようなグループ テーブルに格納する必要があります。

テーブル名:groups

ここに画像の説明を入力

group_IDグループを形成するMIN Product_IDのを格納します。Product_IDS例を挙げると

A が B に一致し、B が C に一致する場合、3 つの行が次の形式でグループ テーブルに移動する必要があります。(A, A), (A, B), (A, C)

相互に関連するサブクエリと CTE を調べてみましたが、これを実装することはできませんでした。

これはすべて SQL で行う必要があります。

助けてくれてありがとう 。

4

3 に答える 3

64

Try this:

;WITH CTE
AS
(
    SELECT DISTINCT
        M1.Product_ID Group_ID,
        M1.Product_ID
    FROM matches M1
        LEFT JOIN matches M2
            ON M1.Product_Id = M2.matching_Product_Id
    WHERE M2.matching_Product_Id IS NULL
    UNION ALL
    SELECT
        C.Group_ID,
        M.matching_Product_Id
    FROM CTE C
        JOIN matches M
            ON C.Product_ID = M.Product_ID
)
SELECT * FROM CTE ORDER BY Group_ID

You can use OPTION(MAXRECURSION n) to control recursion depth.

SQL FIDDLE DEMO

于 2013-01-25T08:48:57.940 に答える
2

Something like this (not tested)

with match_groups as (

  select product_id, 
         matching_product_id,
         product_id as group_id
  from matches
  where product_id not in (select matching_product_id from matches)

  union all

  select m.product_id, m.matching_product_id, p.group_id
  from matches m
    join match_groups p on m.product_id = p.matching_product_id
)
select group_id, product_id
from match_groups
order by group_id;
于 2013-01-25T08:48:44.717 に答える