必要な行を返すクエリがあります。例:
QuestionID QuestionTitle UpVotes DownVotes
========== ============= ======= =========
2142075 Win32: Cre... 0 0
2232727 Win32: How... 2 0
1870139 Wondows Ae... 12 0
ここで、「作成者」(元のポスターや編集者など)のコンマ区切りのリストを含む列を返したいと思います。例えば:
QuestionID QuestionTitle UpVotes DownVotes Authors
========== ============= ======= ========= ==========
2142075 Win32: Cre... 0 0 Ian Boyd
2232727 Win32: How... 2 0 Ian Boyd, roygbiv
1870139 Wondows Ae... 12 0 Ian Boyd, Aaron Klotz, Jason Diller, danbystrom
フェイキング・イット
SQL Server 2000には集計操作がありませんCONCAT(AuthorName, ', ')
。私はそれを偽造してきました。作成TOP 1
者と作成者数に対して、単純な副選択を実行します。
QuestionID QuestionTitle UpVotes DownVotes FirstAuthor AuthorCount
========== ============= ======= ========= =========== ===========
2142075 Win32: Cre... 0 0 Ian Boyd 1
2232727 Win32: How... 2 0 Ian Boyd 2
1870139 Wondows Ae... 12 0 Ian Boyd 3
複数の作成者がいる場合は、ユーザーに省略記号( "…")を表示して、複数の作成者がいることを示します。たとえば、ユーザーには次のように表示されます。
QuestionID QuestionTitle UpVotes DownVotes Authors
========== ============= ======= ========= ==========
2142075 Win32: Cre... 0 0 Ian Boyd
2232727 Win32: How... 2 0 Ian Boyd, …
1870139 Wondows Ae... 12 0 Ian Boyd, …
通常、質問は編集されないため、これで十分に機能します。つまり、99%のケースを完全にサポートし、1%のケースも半分しかサポートしていません。
スレッド化された再クエリ
より複雑でバグが発生しやすい解決策として、表示されたリストを繰り返し、リスト内の「質問」ごとにスレッドプールワーカースレッドを起動し、データベースに対してクエリを実行して作成者のリストを取得することを考えていました。 、次にリストをメモリに集約します。これは、リストが(ネイティブ)アプリケーションで最初に入力されることを意味します。その後、数千の個別のクエリを発行します。
しかし、それは恐ろしく、恐ろしく、ひどく、遅いでしょう。スレッドワークになるので、バグだらけは言うまでもありません。
うんうんうん
アダムメカニックは非常に明白に言います:
SQL Serverでは、行を区切り文字列に連結しないでください。クライアント側で行います。
方法を教えてください、そして私はそれをします。
/泣く
私の元の「TOP1plusellipses」ソリューションと同じくらい速い(たとえば、1桁以内)より良いソリューションを誰かが考えることができますか?
たとえば、リーチ行に結果セットが関連付けられている結果セットを返す方法はありますか?したがって、「マスター」行ごとに、リストを含む「詳細」結果セットを取得できます。
ベストアンサーのコード
アダム・マハニックのソリューションへのケイドのリンクは私が一番好きです。魔法を介して動作するように見えるユーザー定義関数:
CREATE FUNCTION dbo.ConcatAuthors(@QuestionID int)
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @Output VARCHAR(8000)
SET @Output = ''
SELECT @Output = CASE @Output
WHEN '' THEN AuthorName
ELSE @Output + ', ' + AuthorName
END
FROM (
SELECT QuestionID, AuthorName, QuestionDate AS AuthorDate FROM Questions
UNION
SELECT QuestionID, EditorName, EditDate FROM QuestionEdits
) dt
WHERE dt.QuestionID = @QuestionID
ORDER BY AuthorDate
RETURN @Output
END
T-SQLの使用法は次のとおりです。
SELECT QuestionID, QuestionTitle, UpVotes, DownVotes, dbo.ConcatAuthors(AuthorID)
FROM Questions