2011-08-24 29 views
2

我試圖做一個聲明,只根據legacy_call_id__c字段選擇不同的記錄,但我不知道該怎麼做。我得到一個錯誤,獨特的SQL語句錯誤

消息8163,級別16,狀態3,第1行的文本,ntext或圖像數據 類型不能被選擇爲DISTINCT。」

SELECT DISTINCT Name, CreatedDate, clientId__c, completedDate__c 
    , Legacy_Call_ID__c, Description_Short__c 
    FROM Customers.dbo.Incident__c 
    WHERE Description_Short__c LIKE 'New Hire%' 
    OR Description_Short__c LIKE 'Term%' 

我「M使用SQL Server 2008 R2,如果有差別。謝謝!

+1

您能否提供'Customers.dbo.Incident__c'的模式? –

+1

哪一列是文本,ntext或圖像數據類型? –

+0

description_short__c是一個文本列 – lisa

回答

0

你可能有text類型或您選擇查詢ntext的一列,這是不允許用distinct。改變列類型爲改爲。或者在查詢中直接將其丟

SELECT DISTINCT 
    Name, 
    CreatedDate, 
    clientId__c, 
    completedDate__c, 
    Legacy_Call_ID__c, 
    CAST(Description_Short__c AS VarChar(max)) --Assuming that is the Text/nText column 
FROM Customers.dbo.Incident__c 
WHERE Description_Short__c LIKE 'New Hire%' 
    OR Description_Short__c LIKE 'Term%' 

編輯

不完全地肯定,但類似這樣的事情可能工作:

SELECT 
     Name, 
     CreatedDate, 
     clientId__c, 
     completedDate__c, 
     Legacy_Call_ID__c, 
     Description_Short__c 
    FROM 
     Customers.dbo.Incident__c As tblOuter 
    WHERE 
     EXISTS(
      SELECT 
       NULL 
      FROM 
       Customers.dbo.Incident__c as tblInner 
      WHERE 
       (tblInner.Description_Short__c LIKE 'New Hire%' OR 
       tblInner.Description_Short__c LIKE 'Term%') AND 
       tblInner.Legacy_Call_ID__c = tblOuter.Legacy_Call_ID__c 
      GROUP BY 
       tblInner.Legacy_Call_ID__c 
      HAVING 
       MAX(tblInner.CreatedDate) = tblOuter.CreatedDate 
      ) 
+0

我編輯它並收到錯誤,消息170,級別15,狀態1,行1 行1:錯誤的語法靠近'最大'。我再次檢查,以確保它是一個文本數據類型 – lisa

+0

你確定你正在運行SQL Server 2008嗎?測試並將查詢更改爲varchar(8000)並查看是否有效。 – Magnus

+0

我點擊了關於鏈接,它表示SQL Server 2008 R2。改變varchar運行沒有錯誤,但它仍然有重複的legacy_call_id__c行出現。 – lisa

0

你的一個字段不能因爲選擇他們的格式。嘗試使用

CONVERT(nvarchar, Name) 

在您的選擇語句。 IE->

SELECT DISTINCT CONVERT(nvarchar, Name) as Name, CreatedDate, clientId__c, completedDate__c , Legacy_Call_ID__c, Description_Short__c 
FROM Customers.dbo.Incident__c 
WHERE Description_Short__c LIKE 'New Hire%' 
OR Description_Short__c LIKE 'Term%' 

將nvarchar更改爲它應該是的任何字段。玩它,你會最終得到它。這解決了我的選擇問題,如果解決了你的問題,請添加代表。

0

查看下面的查詢。當你處理它時,你應該考慮永久性地將數據類型改爲varchar(max)而不是文本。

SELECT DISTINCT Name, CreatedDate, clientId__c, completedDate__c 
    , Legacy_Call_ID__c, convert(varchar(max), Description_Short__c) 
    FROM Customers.dbo.Incident__c 
    WHERE convert(varchar(max), Description_Short__c) LIKE 'New Hire%' 
    OR convert(varchar(max), Description_Short__c) LIKE 'Term%' 
+0

我收到以下錯誤,消息170,級別15,狀態1,行1 行1:'最大'附近的語法不正確。 – lisa

0

選用基於legacy_call_id__c場

使用不同的你的方式會給你相結合,不僅爲legacy_call_id__c所有列不同值重複的記錄。您可以使用row_number()函數在一個字段上獲取不同的行。在這裏,您將獲得每個legacy_call_id__c的最高值爲CreateDate的行。

SELECT Name, 
     CreatedDate, 
     clientId__c, 
     completedDate__c, 
     Legacy_Call_ID__c, 
     Description_Short__c 
FROM (  
     SELECT Name, 
      CreatedDate, 
      clientId__c, 
      completedDate__c, 
      Legacy_Call_ID__c, 
      Description_Short__c, 
      row_number() OVER(
           PARTITION BY Legacy_Call_ID__c 
           ORDER BY CreatedDate DESC 
          ) AS rn 
     FROM Customers.dbo.Incident__c 
     WHERE Description_Short__c LIKE 'New Hire%' 
     OR Description_Short__c LIKE 'Term%' 
    ) AS T 
WHERE T.rn = 1