2016-11-21 54 views
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次。我不記得如何以更有效的方式做到這一點。有人可以協助嗎?本報告正在做什麼的一些背景:它本質上是一個反向電話目錄。我需要根據他們的電話號碼提取這個人的信息,這個電話號碼可以是上述三種類型中的任何一種(小學,中學或最近的親屬)。

預先感謝您

+0

你能提供執行計劃嗎? –

+1

SQL版本?看起來像一個非常簡單的支點給我。 –

+0

此現有查詢可能不會執行您的想法。它將爲每個字段名稱返回LibraryEvent中的_first_條目,而不是匹配SummarySubjectDataValueAll表格中行內任何內容的條目。 –

回答

2

您可以通過使用條件與聚集只需CASE EXPRESSION避免這一切的嵌套的選擇:

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,因爲這是什麼有名字,姓氏,主要電話等的指定,但我得到以下錯誤,當我這樣做:消息207,級別16,狀態1,行2 列名'LibraryEvent'無效。 消息207,級別16,狀態1,行3 無效的列名'LibraryEvent'。 消息207,級別16,狀態1,行4 列名'LibraryEvent'無效。 消息207,級別16,狀態1,行5 無效的列名'LibraryEvent'。 消息207,級別16,狀態1,行6 無效的列名'LibraryEvent'。 –

+0

列不調用'LibraryEventID'嗎?我不知道你在做什麼錯誤..我不知道表結構。 @Renee' – sagi

+0

對不起,LibraryEventID是LibraryEvent(實際事件名稱)所在的LibraryEvent表的FK。名字,姓氏等標籤是「事件」。 DataValue字段包含實際的名稱值,電話號碼值等。 –

相關問題