Ошибка оператора SQL - PullRequest
       9

Ошибка оператора SQL

2 голосов
/ 24 августа 2011

Я пытаюсь сделать оператор, чтобы выбрать только отдельные записи на основе поля legacy_call_id__c, но я не уверен, как это сделать.Я получаю сообщение об ошибке:

Сообщение 8163, уровень 16, состояние 3, строка 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 голосов
/ 24 августа 2011

выбор отдельных записей на основе поля legacy_call_id__c

Если использовать способ, отличный от того, что вы делаете, вы получите различные значения для всех столбцов вместе, а не только для legacy_call_id__c. Вы можете использовать функцию row_number(), чтобы получить строки с различными значениями в одном поле. Здесь вы получите строки с наибольшим значением CreateDate для каждого legacy_call_id__c.

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
0 голосов
/ 24 августа 2011

Одно из ваших полей не может быть выбрано из-за формата, в котором они находятся. Попробуйте использовать

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 голосов
/ 24 августа 2011

См. Запрос ниже. Пока вы работаете над этим, вы должны постоянно менять тип данных на 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 голосов
/ 24 августа 2011

Возможно, в вашем запросе на выбор есть столбец типа text или ntext, который не разрешен для 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
            )
...