0

(10の異なるシステムに)ユーザーデータのテーブルが10個あり、どのユーザーもそれらの10個のテーブルのうち0個以上にレコードを持つことができるとします。

結合クエリは、10個のテーブルすべてのデータをマージして、ユーザーごとに1行、10個のテーブルすべての列を持つ結果セットを生成するようになります。各ユーザーのレコードについて、そのユーザーのデータがないテーブルの列はnullになります。

私が遭遇している問題は、ユーザー名でテーブル1(t1)とテーブル2(t2)で完全結合を実行した後、t1.Usernameまたはt2.Usernameのいずれかがnullになる可能性がある結果セットが残ることです(たとえば、ユーザーがt1にのみレコードを持っていて、t2にはない場合、またはその逆の場合)。どちらのユーザー名もnullになる可能性があるため、「or」条件を含む複雑な「on」句を記述せずに、どのユーザー名フィールドをt3(および後続のテーブル)と結合する必要があります。

これをきれいに行う唯一の方法は、各結合後にユーザー名を結合し、後続の各テーブルを前の結果セットの結合されたユーザー名フィールドに結合することです。

私の最初の選択は次のようになります。

select coalesce(t1.username,t2.username) as U2, t1.*, t2.*
from t1 full outer join t2 on t1.Username = t2.Username

次に、t3をt3.Username=U2の結果セットに結合する必要があります。ただし、t4に参加する前に、t3.UsernameとU2を合体させてU3を取得する必要があるため、U3でt4.Usernameに参加することができます。そのためには、最初のselectステートメントが、追加のテーブルごとに新しい合体したユーザー名を選択するクエリ内のサブクエリである必要があるように思われます。クエリの最終的な形式は、必然的にネストされた一連のサブクエリのように見えます。それはどうあるべきか、それともこれを行う別の方法がありますか?

私がやりたくないのは、10個のテーブルすべてのユーザー名を結合することによって事前に生成した一意のユーザー名リストに対する一連の左結合です。それは機能し、非常にクリーンな単一レベルのクエリですが、これらの10個のテーブルのそれぞれの生成にはコストがかかるため、ここでの答えのように一意のユーザー名を取得するためだけにそれらを事前に生成したくありません:https: //stackoverflow.com/a/9233478/88409

私はここで別の議論も見ました:http ://www.listserv.uga.edu/cgi-bin/wa?A2 = ind1110b&L = sas-l&P = 1445これはそれがどのように行われるかについての4つの異なるバージョンを示しています(最初のものはサブクエリを回避します)が、where句で合体を使用し、テーブルが追加されるたびにサイズが大きくなります。

4

1 に答える 1

0

10セットのそれぞれをテーブル変数(基本的にはキャッシュ)に生成します。次に、テーブル変数に関する他の質問の手法を使用します。テーブル変数をすばやくマージできるように、各テーブル変数で主キーを宣言することをお勧めします。

于 2013-03-06T01:52:45.920 に答える