1

ご挨拶、

これが私の問題です。
複数の行からデータを取得し、より大きなクエリで単一の結果として返す必要があります。

私はすでに同様の質問をここに投稿しました。 メインクエリ内の 1 つの列に複数の値を返しますが、SQL の知識が不足しているため、答えがうまくいかなかったため、質問があいまいになったのではないかと思います。
私は Microsoft SQL 2005 を使用しています。
これが私が持っているものです。

CaseID を PK とする複数のテーブル。CaseID は一意です。
CaseID と ItemNum(AutoInc) を PK として組み合わせた 1 つのテーブル (tblKIN)。
データベース内の各個人には、複数の親戚がいる可能性が高いためです。
SQLクエリウィンドウで次を実行すると、機能します。

DECLARE @KINList varchar(1000)  
SELECT @KINList = coalesce(@KINList + ', ','') + KINRel from tblKIN  
WHERE CaseID = 'xxx' and Address = 'yyy'  
ORDER BY KINRel  
SELECT @KINList  

これは、同じ住所に住んでいるすべての人の関係を返します。結果はこんな感じ・・・
父、姪、妹、息子

さて、私にとっての問題は、それをメインクエリにどのように追加するかです。
関連情報に短縮すると、主なクエリは次のようになります。

SELECT DISTINCT  
c.CaseID,  
c.Name,  
c.Address,  
Relatives=CASE WHEN exists(select k.CaseID from tblKIN k where c.CaseID = k.CaseID)  
   THEN DECLARE @KINList varchar(1000)  
        SELECT @KINList = coalesce(@KINList + ', ','') + KINRel from tblKIN  
        WHERE CaseID = 'xxx' and Address = 'yyy'  
        ORDER BY KINRel  
        SELECT @KINList  
   ELSE ''  
   END
FROM tblCase c  
ORDER BY c.CaseID

私が受け取るエラーは次のとおりです。
サーバー: メッセージ 156、レベル 15、状態 1、行 13
キーワード「DECLARE」付近の構文が正しくありません。
サーバー: メッセージ 156、レベル 15、状態 1、行 18
キーワード「ELSE」付近の構文が正しくありません。

DECLARE から SELECT @KINList の末尾までを括弧内に入れ子にしてみました。
CASE ステートメントの THEN セクションに BEGIN と END を追加してみました。
どちらも機能しませんでした。

ソース テーブル データは次のようになります。(読みやすくするためにピリオドを追加)
tblCase
CaseID Name Address
10-001 Jim......100 Main St.
10-002 Tom....150 Elm St.
10-003 Abe.....200 1st St.

tblKIN
CaseID ItemNum Name Relation Address
10-001 00001 Steve...Son........100 Main St.
10-002 00002 James..Father....150 Elm St.
10-002 00003 Betty.. ..Niece......150 Elm St.
10-002 00004 Greta...Sister.....150 Elm St.
10-002 00005 Davey..Son........150 Elm St. .
10-003 00006 エドガー...ブラザー...200 1st St.

CaseID = 10-002 のクエリを実行すると、次のものが返される必要があります。
CaseID 名前 住所.......親戚
10-002 Tom...150 Elm St. ..Father, Niece, Sister, Son

これはおそらく簡単な修正であると確信していますが、その方法がわかりません。
お時間をいただきありがとうございます。質問が長くなって申し訳ありませんが、はっきりさせておきたいと思います。

ありがとう !!!

4

2 に答える 2

0

FUNCTIONを引数として取り、またはcaseIDを返すを作成できます。truefalse

ネストされたクエリを複数回呼び出すため、間違いなくパフォーマンスが低下します。より良い解決策は、クエリを実行し、結果を一時テーブルに格納することです。次に、この一時テーブルと を に渡し、含まcaseIDれているFUNCTIONかどうかを確認します。

于 2010-12-13T21:18:07.750 に答える
0

似たようなことをしたとき、varchar の結果を返す結合を行うスカラー関数を作成する必要がありました。次に、選択でそれを呼び出します。

CREATE FUNCTION GetRelatives 
(
    @CaseID varchar(10)
)
RETURNS varchar(1000)
AS
BEGIN

    DECLARE @KINList varchar(1000)  
    SELECT @KINList = coalesce(@KINList + ', ','') + KINRel from tblKIN  
        WHERE CaseID = @CaseID  
    ORDER BY KINRel  

    RETURN @KINList 

END

次に、あなたの選択

SELECT DISTINCT  
c.CaseID,  
c.Name,  
c.Address,  
database.dbo.GetRelatives(c.CaseID) AS Relatives
FROM tblCase c  
ORDER BY c.CaseID
于 2010-12-13T21:22:40.147 に答える