私は、クエリを作成する方法このsqlで列の方法で行をフェッチする方法は?
memberId1 MemberId2 PersonId
4057 4502 1787
ようなクエリの結果をしたい
memberId PersonId Year
4057 1787 2
4502 1787 3
のように私のテーブルのレコードを持っています?
私は、クエリを作成する方法このsqlで列の方法で行をフェッチする方法は?
memberId1 MemberId2 PersonId
4057 4502 1787
ようなクエリの結果をしたい
memberId PersonId Year
4057 1787 2
4502 1787 3
のように私のテーブルのレコードを持っています?
クエリでこれを行うのではなく、アプリケーション層で行います。
SQLではこれを行わないでください。最高であなたが試すことができます:
SELECT table1.memberId memberId1, table2.memberId MemberId2, PersonId
FROM table table1 JOIN table table2 USING (PersonId)
しかし、それはあなたが人のための2つ以上のメンバーを持っている場合は期待どおりに行いません。 (可能なすべての組み合わせが返されます)
以下は、SQLで直接行う方法の例です。最適化の余地が十分あることを念頭に置いてください。ただし、PersonIDと年のインデックスがある場合は、このバージョンはかなり高速になります。
SELECT DISTINCT PersonID,
memberId1 = Convert(int, NULL),
memberId2 = Convert(int, NULL)
INTO #result
FROM myTable
WHERE Year IN (2 , 3)
CREATE UNIQUE CLUSTERED INDEX uq0_result ON #result (PersonID)
UPDATE #result
SET memberId1 = t.memberId
FROM #result upd
JOIN myTable t
ON t.PersionId = upd.PersonID
AND t.Year = 2
UPDATE #result
SET memberId2 = t.memberId
FROM #result upd
JOIN myTable t
ON t.PersionId = upd.PersonID
AND t.Year = 3
SELECT * FROM #result
クラスタ化インデックスは不要です。通常のものはうまくいくでしょうし、おそらくもっと速くなります。 – Ariel
私は興味があり、いくつかのサンプルデータでいくつかのテストを行いました(objectID、user_type_idのmemberId、myTableと大規模データベースのsys.columnsを置き換えました)。クエリの計画と統計時間はほぼ同じですが、私の経験では、インデックスが適切であれば、通常は後で高速化されるので、インデックスの作成はクラスタリングされると若干遅くなることに同意します。 )また、ブックマーク検索の必要がなく、MSSQLがヒープを好きではないようだからです。IMHO – deroby
結果セットを特定の順序で返す必要がある場合は、クラスタ化インデックスが使用されます(役立ちます)。テーブルにそのようなインデックスが1つあります。personIDをその列にすることは時期尚早です。このアプリケーションについてさらに知らなくても、アービトラでソートされた結果セットを返す必要はほとんどありませんpersonIDなどのID。私はどの列が順番にソートされているかを知った後でのみ、クラスタード・インデックスを作成します。ある列がわからない場合は、クラスタード・インデックスを使用せず、後でオプションとして残しておきます。 – Ariel
あなたは、各PERSON_IDのためのすべての会員IDをしたい場合、あなたは文字列が得られ
select distinct PersonId
, (select ' '+cast(t0.MemberId as varchar)
from table t0
where t0.PersonId=t1.PersonId
for xml path('')
) [Member Ids]
from table t1
内のすべてのMEMBERID秒CONCATする[XMLパスのために]声明(素晴らしい機能) を使用することができます。
PersonId Members Ids
1787 ' 4057 4502'
あなたが本当にmemberIdsの無制限の数の別々の列を、必要な場合は、ピボットテーブルを 使用を検討したが、Uにはるかに複雑なse
これを行う方法?あなたは説明できますか? –
明らかにそれは関係するレコードの数によって異なります。大きなレコードセットのアプリケーション層でこれを行うことに強くアドバイスします。 – deroby
私はそれに同意しません。あなたはそれを使って遊ぶことができ、何が何回行われているかを見てください。 –