4

このようなクエリがあります

SELECT J.JobID,T.Title FROM JobsTagMap J
Left Join Tags T
ON J.TagID=T.TagID

これにより、次のデータセットが返されます(簡略化すると、JobIDは実際にはUniqueIdentifierです)

JobID    Title
1        Tag1
1        Tag2
2        Tag2
2        Tag5
2        Tag9

ここで、これをJobID列でグループ化し、タイトルを連結したいので、結果は次のようになります。

JobID    Title
1        Tag1,Tag2
2        Tag2,Tag5,Tag9

どうすればいいですか?

4

3 に答える 3

10

SQLServer2005以降を使用している場合。次に、次のように実行できます。

SELECT 
    JobsTagMap.JobID,
    STUFF
    (
        (
            SELECT 
                ',' +Title
            FROM
                Tags
            WHERE
                Tags.TagID=JobsTagMap.TagID
            FOR XML PATH('')
        )
    ,1,1,'') AS Title
FROM JobsTagMap

編集

異なるテーブルのテーブル構造とデータを表示しなかったためです。ちょっとわかりづらいです。したがって、テーブル構造は次のようになっていると思います。

CREATE TABLE JobsTagMap
(
    JobID INT,
    TagID INT
)

CREATE TABLE Tags
(
    TagID INT,
    Title VARCHAR(100)
)

このデータで:

INSERT INTO JobsTagMap
VALUES(1,1),(1,2),(2,2),(2,4),(2,5)

INSERT INTO Tags
VALUES(1,'Tag1'),(2,'Tag2'),(3,'Tag2'),(4,'Tag5'),(5,'Tag9')

表示しているデータを取得している場合は、JobID一意にすることはできません。あなたはJobそれがユニークであるところにテーブルを持っているかもしれません。表示しているこれらのテーブルを使用したいだけの場合は、次のようなことを行う必要があります。

;WITH CTE
AS
(
    SELECT
        ROW_NUMBER() OVER(PARTITION BY JobID ORDER BY JobID) AS RowNbr,
        JobsTagMap.*
    FROM
        JobsTagMap
)
SELECT
    *,
    STUFF
    (
        (
            SELECT 
                ',' +Title
            FROM
                Tags
                JOIN JobsTagMap
                    ON Tags.TagID=JobsTagMap.TagID
            WHERE
                JobsTagMap.JobID=CTE.JobID
            FOR XML PATH('')
        )
    ,1,1,'') AS Title
FROM
    CTE
WHERE
    CTE.RowNbr=1

これにより、次の結果が得られます。

1   1   1   Tag1,Tag2
1   2   2   Tag2,Tag5,Tag9

したがって、将来的には常にどのテーブル構造とそのデータを表示するかを示します。それはあなたにもっと良い答えを与えるでしょう

于 2012-05-05T12:40:57.743 に答える
1

そのためにスカラー関数を使用します。decryは行ベースの操作を使用してはならないという純粋主義者もいるでしょうが、これは機能します。数行しか返さない場合は、応答時間は問題ありません。

CREATE FUNCTION [dbo].[JoinMVText]

(

  @sID int,

  @fieldID tinyint

)

RETURNS VARCHAR(MAX)

AS 

BEGIN

   DECLARE @MVtextList varchar(max)

   SELECT @MVtextList = COALESCE(@MVtextList + '; ', '') + docMVtext.value

   FROM docMVtext with (nolock) 

   WHERE docMVtext.sID = @sID and fieldID = @fieldID

   RETURN @MVtextList

END
于 2012-05-05T12:44:30.720 に答える
-1

私はあなたと同じ問題を抱えていて、遅い副選択を回避する方法を見つけました。

GROUP BYの使用:

(70500 rows affected)

 SQL Server Execution Times:
   CPU time = 94 ms,  elapsed time = 833 ms.

サブ選択の使用:

(70500 rows affected)

 SQL Server Execution Times:
   CPU time = 1469 ms,  elapsed time = 2323 ms.

副選択は4倍以上遅くなります...

解決策は次のとおりです。

SELECT 
    J.JobID,
    STRING_AGG(ISNULL(T.Title, ''), ',') as Title
FROM JobsTagMap J
LEFT JOIN Tags T ON J.TagID = T.TagID
GROUP BY J.JobID;

何かが十分に明確でない場合は私に知らせてください:)

于 2020-01-29T12:08:28.120 に答える