2016-11-21 5 views
1

私は何を要求しているのかについてはっきりしていませんが、レポートのクエリを作成しようとしています。作成する各列の自分の値はすべて現在1つの列にあります。現在のクエリは次のとおりです。別の列の値から新しい列を作成しているクエリを高速化するにはどうすればよいですか?

SELECT [SubjectID] 
    ,(SELECT [DataValue] 
     FROM [SummarySubjectDataValueAll] 
     WHERE [LibraryEventID] IN (
       SELECT [LibraryEventID] 
       FROM [LibraryEvent] 
       WHERE [Name] LIKE '%First Name%') 
    ) as FirstName 
    ,(SELECT [DataValue] 
     FROM [SummarySubjectDataValueAll] 
     WHERE [LibraryEventID] IN 
        (SELECT [LibraryEventID] 
         FROM [LibraryEvent] 
         WHERE [Name] LIKE '%Last Name%')) as LastName 
    ,(SELECT [DataValue] 
     FROM [SummarySubjectDataValueAll] 
     WHERE [LibraryEventID] IN (
       SELECT [LibraryEventID] 
       FROM [LibraryEvent] 
       WHERE [Name] LIKE 'Primary Phone')) as Phone 
    ,(SELECT [DataValue] 
     FROM [SummarySubjectDataValueAll] 
     WHERE [LibraryEventID] IN (
      SELECT [LibraryEventID] 
      FROM LibraryEvent] 
      WHERE [Name] = 'Secondary Phone')) as Phone2 
     ,(SELECT [DataValue] 
     FROM [SummarySubjectDataValueAll] 
     WHERE [LibraryEventID] IN (
       SELECT [LibraryEventID] 
       FROM [LibraryEvent] 
       WHERE [Name] = 'Next of Kin Phone')) as KinPhone 
    FROM [SummarySubjectDataValueAll] 
    WHERE DataValue = @Phone 

(個別に、私は必要なものを非常に迅速に取得します)それは情報を引き抜こうとするのに10分以上続いています。同じテーブルを6回再実行するためです。もっと効率的なやり方でこれをやり直す方法を思い出すことができません。誰かが助けてくれますか?このレポートの背景に関するいくつかの背景:本質的に逆の電話帳です。私は上記の3つのタイプ(プライマリ、セカンダリ、または隣人のいずれか)のいずれかである可能性のある自分の電話番号に基づいて人の情報を引き出す必要があります。

はあなたが単にCASE EXPRESSION条件付き集約を使用して、すべてこのネストされた選択を回避することができ、事前

+0

あなたが実行計画をしてください提供することはできますか? –

+1

SQLバージョン?私には非常に単純なピボットのようだ。 –

+0

この既存のクエリはおそらくあなたの考えをしません。これは、SummarySubjectDataValueAllテーブルの行にあるものと一致するものではなく、各フィールド名のLibraryEventの_first_エントリを返します。 –

答えて

2

にありがとう:

SELECT t.subjectID, 
     MAX(CASE WHEN t.name LIKE '%First Name%' THEN t.DataValue END) as FirstName, 
     MAX(CASE WHEN t.name LIKE '%Last Name%' THEN t.DataValue END) as LastName, 
     MAX(CASE WHEN t.name = 'Primary Phone' THEN t.DataValue END) as Phone, 
     MAX(CASE WHEN t.name = 'Secondary Phone' THEN t.DataValue END) as Phone2, 
     MAX(CASE WHEN t.name = 'Next of Kin Phone' THEN t.DataValue END) as KinPhone 
FROM SummarySubjectDataValueAll t 
JOIN LibraryEvent s 
ON(t.LibraryEventID = s.LibraryEventID) 
GROUP BY t.subjectID 
+0

私はt.nameをs.LibraryEventに変更する必要があると仮定しています。その名前、名字、プライマリ電話などの指定がありますが、それを行うと次のエラーが発生します:msg 207、レベル16、状態1、行2 無効な列名 'LibraryEvent'。 msg 207、レベル16、状態1、行3 無効な列名 'LibraryEvent'。 msg 207、レベル16、状態1、行4 無効な列名 'LibraryEvent'。 msg 207、レベル16、状態1、行5 無効な列名 'LibraryEvent'。 msg 207、レベル16、状態1、行6 無効な列名 'LibraryEvent'。 –

+0

'LibraryEventID'という列はありませんか?私はあなたが間違っていることを知ることはできません..私はテーブルの構造を知らない。 @Renee ' – sagi

+0

申し訳ありませんが、LibraryEventIDは、LibraryEvent(実際のイベント名)が格納されているLibraryEventテーブルへのFKです。名字、姓などのラベルは「イベント」です。 DataValueフィールドには、実際の名前の値、電話番号の値などが含まれます。 –

関連する問題