不同的SQL语句错误

时间:2011-08-24 16:21:12

标签: sql sql-server sql-server-2008 distinct

我正在尝试做一个声明,只根据legacy_call_id__c字段选择不同的记录,但我不知道该怎么做。我收到了一个错误,

  

Msg 8163,Level 16,State 3,Line 1 text,ntext或image数据   类型不能被选为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%'

如果这有所不同,我正在使用SQL Server 2008R2。谢谢!

4 个答案:

答案 0 :(得分:0)

您的选择查询中可能有textntext类型的列,distinct不允许这样。请将列类型更改为varchar(max)。或者直接在查询

中投射
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
            )

答案 1 :(得分:0)

由于其格式,您的某个字段无法选择。请尝试使用

CONVERT(nvarchar, Name) 
在你的select语句中

。 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更改为应该是的任何字段。玩它,你最终会得到它。这解决了我的选择问题,如果它解决你的问题,添加代表。

答案 2 :(得分:0)

请参阅下面的查询。在您使用它时,您应该考虑将数据类型永久更改为varchar(max)而不是text。

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%'

答案 3 :(得分:0)

  

根据legacy_call_id__c字段选择不同的记录

使用不同的方式将为所有列组合提供不同的值,而不仅仅是legacy_call_id__c。您可以使用row_number()函数在一个字段上获取不同的行。在这里,您将获得每个CreateDate的{​​{1}}最高值的行。

legacy_call_id__c