0

2 つのテーブルと 1 つのジャンクション テーブルがあります。

table 1 (Log):      | Id | Title | Date | ...
table 2 (Category): | Id | Title | ...

テーブル 1 と 2 の間のジャンクション テーブル:

LogCategory: | Id | LogId | CategoryId 

ここで、次のような 1 つのフィールドにすべてのカテゴリのタイトルを含むすべてのログを取得する SQL クエリが必要です。

LogId, LogTitle, ..., Categories(that contains all category title assigned to this log id) 

これを解決するのを手伝ってくれる人はいますか? ありがとう

4

1 に答える 1

2

このコードを試してください:

DECLARE @results TABLE
( 
  idLog int,
  LogTitle varchar(20), 
  idCategory int,
  CategoryTitle varchar(20)
)

INSERT INTO @results
SELECT l.idLog, l.LogTitle, c.idCategory, c.CategoryTitle
FROM
  LogCategory lc
  INNER JOIN Log l 
    ON lc.IdLog = l.IdLog
  INNER JOIN Category c
    ON lc.IdCategory = c.IdCategory

SELECT DISTINCT 
    idLog,
    LogTitle,
    STUFF (
        (SELECT ', ' + r1.CategoryTitle
        FROM @results r1
        WHERE r1.idLog = r2.idLog
        ORDER BY r1.idLog
        FOR XML PATH ('')
        ), 1, 2, '')
FROM 
    @results r2

ここに簡単なSQLフィドルの例があります

このクエリは1つの選択だけを使用して記述できると確信していますが、この方法で読み取り可能であり、コードの機能を説明できます。

最初の選択では、すべてのログ-カテゴリの一致がテーブル変数に取り込まれます。

2番目の部分はFOR XML、カテゴリ名を選択し、結果をテーブルではなくXMLで返すために使用します。FOR XML PATH ('')'、'を使用して選択に配置すると、すべてのXMLタグが結果から削除されます。そして最後に、STUFF命令はすべての行の最初の'、'文字を置き換え、代わりに空の文字列を書き込みます。これにより、文字列のフォーマットが正しくなります。

于 2012-12-19T08:41:08.057 に答える