85

私は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 クエリを実行する必要があることを意味します。ここで、X は の結果の数ですTableA

の行に対して複数の結果が返されるため、単純に GROUP BY などを実行できないことに注意してくださいTableA

COALESCE などを利用した UDF が機能するかどうかはわかりません。

4

10 に答える 10

137

これでも目的を果たします

サンプルデータ

declare @t table(id int, name varchar(20),somecolumn varchar(MAX))
insert into @t
    select 1,'ABC','X' union all
    select 1,'ABC','Y' union all
    select 1,'ABC','Z' union all
    select 2,'MNO','R' union all
    select 2,'MNO','S'

クエリ:

SELECT ID,Name,
    STUFF((SELECT ',' + CAST(T2.SomeColumn AS VARCHAR(MAX))
     FROM @T T2 WHERE T1.id = T2.id AND T1.name = T2.name
     FOR XML PATH('')),1,1,'') SOMECOLUMN
FROM @T T1
GROUP BY id,Name

出力:

ID  Name    SomeColumn
1   ABC     X,Y,Z
2   MNO     R,S
于 2009-12-21T14:09:12.347 に答える
45

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
于 2008-09-21T17:02:14.943 に答える
13

MySQL には、求めているものを返すgroup_concat関数があります。

SELECT TableA.ID, TableA.Name, group_concat(TableB.SomeColumn) 
as SomColumnGroup FROM TableA LEFT JOIN TableB ON 
TableB.TableA_ID = TableA.ID
于 2008-09-21T16:30:31.743 に答える
11

あなたは COALESCE で正しい方向に進んでいると思います。コンマ区切りの文字列を作成する例については、こちらを参照してください。

http://www.sqlteam.com/article/using-coalesce-to-build-comma-delimited-string

于 2008-09-21T16:22:19.407 に答える
0

より正確な回答を得るために、さらに詳細を提供する必要がある場合があります。

データセットが狭いように見えるので、結果ごとに行を使用し、クライアントで後処理を実行することを検討してください。

したがって、サーバーに作業をさせたい場合は、次のような結果セットを返します

ID       Name       SomeColumn
1        ABC        X
1        ABC        Y
1        ABC        Z
2        MNO        R
2        MNO        S

もちろん、これは ID の単純な INNER JOIN です

クライアントに結果セットが返されたら、CurrentName という変数を維持し、それをトリガーとして使用して、SomeColumn の収集を停止して、必要な有用なことを行います。

于 2008-09-21T16:26:41.720 に答える
0

テーブル A に WHERE 句しかない場合、次のようにストアド プロシージャを作成します。

SELECT Id, Name From tableA WHERE ...

SELECT tableA.Id AS ParentId, Somecolumn 
FROM tableA INNER JOIN tableB on TableA.Id = TableB.F_Id 
WHERE ...

次に、それを DataSet ds に入力します。それで

ds.Relations.Add("foo", ds.Tables[0].Columns("Id"), ds.Tables[1].Columns("ParentId"));

最後に、すべての行にカンマを配置するページにリピーターを追加できます

 <asp:DataList ID="Subcategories" DataKeyField="ParentCatId" 
DataSource='<%# Container.DataItem.CreateChildView("foo") %>' RepeatColumns="1"
 RepeatDirection="Horizontal" ItemStyle-HorizontalAlign="left" ItemStyle-VerticalAlign="top" 
runat="server" >

このようにして、クライアント側で実行しますが、クエリは 1 つだけで、データベースとフロントエンドの間で最小限のデータを渡します

于 2008-09-21T16:42:41.637 に答える
-1
SELECT t.ID, 
       t.NAME, 
       (SELECT t1.SOMECOLUMN 
        FROM   TABLEB t1 
        WHERE  t1.F_ID = T.TABLEA.ID) 
FROM   TABLEA t; 

これは、サブクエリを使用して別のテーブルから選択する場合に機能します。

于 2012-05-01T16:22:31.850 に答える
-1

以下の解決策:

SELECT GROUP_CONCAT(field_attr_best_weekday_value)as RAVI
FROM content_field_attr_best_weekday LEFT JOIN content_type_attraction
    on content_field_attr_best_weekday.nid = content_type_attraction.nid
GROUP BY content_field_attr_best_weekday.nid

これを使用して、結合を変更することもできます

于 2009-12-21T11:59:37.290 に答える