0

INNER JOIN と LEFT JOIN を使用する T-SQL クエリの連結結果でフィールドを更新する必要があります。STUFF 関数と FOR XML PATH 関数を使用して、より単純なクエリでこれを行うことができましたが、より複雑なクエリで同じプロセスを実行しようとしてもうまくいきませんでした。

これは、ID フィールドが最終的にグループ化され、Step フィールドは、連結された値が 1 つの ID ごとに 1 つのフィールドにある必要がある結果を提供するクエリです。

SELECT sc.ID, sc.STEP
FROM Table1 As sc
INNER JOIN Table2 As f
    ON sc.STEP = f.Step AND sc.STEP_TYPE = f.StepType AND   
sc.OldStep = f.OldStep
LEFT JOIN Table3 As l
ON sc.ID = l.ID
WHERE f.Group = l.Group AND sc.CompDate IS NULL

これにより、ID ごとに複数のフィールドに分割された結果が得られます

•ID-----STEP

  • 01 - 101
  • 01 - 102
  • 01 - 103
  • 02 - 107
  • 02 - 113

そして、私が必要とするのは:

•ID-----STEP

  • 01 - 101、102、103
  • 02 - 107、113

これが私がこれまでに試したことです:

;With OA As 
(   SELECT s.ID, STUFF((
    SELECT ', ' + sc.STEP
    FROM Table1 As sc
    WHERE sc.ID = s.ID
    ORDER BY sc.ID
    FOR XML PATH('')),1,1,'') As Steps
FROM Table1 As s
INNER JOIN Table2 As f
    ON s.STEP = f.Step AND s.STEP_TYPE = f.StepType 
            AND s.OldStep = f.OldStep
LEFT JOIN Table3 As l
    ON s.ID = l.ID
WHERE f.Group = l.Group AND s.CompDate IS NULL
GROUP BY s.ID
)

SELECT * FROM OpenAuditSteps

ここでの問題は、個々の ID でグループ化されたレコードだけでなく、すべてのレコードの連結を取得していることです。結合を配置するさまざまな方法を試しましたが、これまでのところ何も機能していません。

4

1 に答える 1

0

あなたはもうすぐそこにいます: あなたはすでに最初のクエリを動かしています. その結果が #Table1 に入ると仮定すると、

SELECT  Distinct
        sc1.ID,
    STUFF (( Select  ',' + sc2.STEP 
    FROM #Table1 AS SC2
    WHERE sc2.ID = sc1.ID
    FOR XML PATH('')),1,1,'') AS STEPS
FROM #Table1 AS SC1
ORDER BY sc1.ID

したがって、WITH を使用して 1 つのクエリに結合するには、次のようにします。

    ;WITH IDSteps AS (
SELECT sc.ID, sc.STEP
FROM Table1 As sc
INNER JOIN Table2 As f
    ON sc.STEP = f.Step AND sc.STEP_TYPE = f.StepType AND   
sc.OldStep = f.OldStep
LEFT JOIN Table3 As l
ON sc.ID = l.ID
WHERE f.Group = l.Group AND sc.CompDate IS NULL
)
SELECT  Distinct
        sc1.ID,
    STUFF (( Select  ',' + sc2.STEP 
    FROM IDSteps AS SC2
    WHERE sc2.ID = sc1.ID
    FOR XML PATH('')),1,1,'') AS STEPS
FROM IDSteps AS SC1
ORDER BY sc1.ID;
于 2012-08-15T14:23:50.277 に答える