1. ホーム
  2. sql-server

[解決済み] サブクエリ内の複数の結果をカンマ区切りの1つの値に結合する

2023-05-04 10:34:47

質問

2つのテーブルがあります。

TableA
------
ID,
Name

TableB
------
ID,
SomeColumn,
TableA_ID (FK for TableA)

関係は、1行の TableA - の多くの TableB .

さて、このような結果を見たいのですが。

ID     Name      SomeColumn

1.     ABC       X, Y, Z (these are three different rows)
2.     MNO       R, S

これはうまくいきません(サブクエリで複数の結果)。

SELECT ID,
       Name, 
       (SELECT SomeColumn FROM TableB WHERE F_ID=TableA.ID)
FROM TableA

クライアント側で処理を行えば、これは些細な問題です。しかし、これは私がすべてのページでX個のクエリを実行しなければならないことを意味します。 TableA .

の行に対して複数の結果を返してしまうので、単純に GROUP BY などはできないことに注意してください。 TableA .

COALESCEなどを利用したUDFが有効ではないでしょうか?

どのように解決するのですか?

1. UDFを作成します。

CREATE FUNCTION CombineValues
(
    @FK_ID INT -- The foreign key from TableA which is used 
               -- to fetch corresponding records
)
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @SomeColumnList VARCHAR(8000);

SELECT @SomeColumnList =
    COALESCE(@SomeColumnList + ', ', '') + CAST(SomeColumn AS varchar(20)) 
FROM TableB C
WHERE C.FK_ID = @FK_ID;

RETURN 
(
    SELECT @SomeColumnList
)
END

2. サブクエリで使用する。

SELECT ID, Name, dbo.CombineValues(FK_ID) FROM TableA

3. ストアドプロシージャを使用する場合は、このようにします。

CREATE PROCEDURE GetCombinedValues
 @FK_ID int
As
BEGIN
DECLARE @SomeColumnList VARCHAR(800)
SELECT @SomeColumnList =
    COALESCE(@SomeColumnList + ', ', '') + CAST(SomeColumn AS varchar(20)) 
FROM TableB
WHERE FK_ID = @FK_ID 

Select *, @SomeColumnList as SelectedIds
    FROM 
        TableA
    WHERE 
        FK_ID = @FK_ID 
END