所以我有一个查询,没有一个SELECT DISTINCT
在它,但我得到一个The text data type cannot be selected as DISTINCT because it is not comparable
错误。这个相同的查询已经运行多年没有错误,突然它不工作了。我最喜欢将其中一个表中的列的数据类型更改为文本,但仍然…查询中没有DISTINCT
,为什么会出现错误
下面是查询:
SELECT
s.dept_abrev + ' ' + s.crs_num + ' ' + s.section_code AS course,
app.approval_id,
app.role_id,
r.role_name,
app.section_id,
d.delivery_method,
app.approve,
app.reject,
app.notes,
x.xl_code,
x.xl_cap,
s.section_cap,
rt.role_priority,
p.person_id,
p.f_name + ' ' + p.l_name AS approver_name,
p.email,
ip.person_id AS inst_person_id,
ip.f_name + ' ' + ip.l_name AS instructor_name,
'RCDE' AS who
FROM
cas_Approval app
INNER JOIN cas_Sections s ON (s.section_id = app.section_id)
AND s.section_status_id IN (3,4)
INNER JOIN cas_Contract AS c ON (c.section_id = app.section_id)
INNER JOIN cas_Instructor AS i ON (i.instructor_id = c.instructor_id)
INNER JOIN cas_Person AS ip ON (i.person_id = ip.person_id)
INNER JOIN cas_Role r ON (app.role_id = r.role_id)
LEFT OUTER JOIN cas_XLCode x ON (x.xl_id = s.xl_id)
INNER JOIN cas_DeliveryMethod d ON (d.delivery_id = s.delivery_id)
INNER JOIN cas_RoleTypes rt ON (rt.role_type_id = r.role_type_id)
INNER JOIN cas_PersonToRole AS ptr ON r.role_id = ptr.role_id
INNER JOIN cas_Person AS p ON ptr.person_id = p.person_id
INNER JOIN cas_semesters sem ON s.semester_id = sem.semester_id
AND sem.is_template = 0
WHERE
app.approve IS NULL
AND (SELECT COUNT(reject) FROM cas_Approval WHERE section_id = s.section_id OR section_id = s.parent_section_id) = 0
AND app.reject IS NULL
AND s.semester_id = 27
AND ip.person_id <> p.person_id
UNION
SELECT
c.dept_abrev + ' ' + c.crs_num + ' ' + c.sectionCode AS course,
app.approval_id,
app.role_id,
r.role_name,
app.section_id,
(CASE c.instructMethod
WHEN 'P' THEN 'Traditional'
WHEN 'I' THEN 'Online'
WHEN 'R' THEN 'Broadcast'
END) AS delivery_method,
app.approve,
app.reject,
app.notes,
c.xlCode AS xl_code,
NULL AS xl_cap,
c.courseCap AS section_cap,
rt.role_priority,
p.person_id,
p.f_name + ' ' + p.l_name AS approver_name,
p.email,
ip.person_id AS inst_person_id,
insFirstName + ' ' + insLastName AS instructor_name,
'USU-E' AS who
FROM
cas_Approval app
INNER JOIN cas_usuECourses c ON (c.id = app.eastId)
AND c.status IN ('P','A','S')
INNER JOIN cas_Role r ON (app.role_id = r.role_id)
INNER JOIN cas_RoleTypes rt ON (rt.role_type_id = r.role_type_id)
INNER JOIN cas_PersonToRole AS ptr ON r.role_id = ptr.role_id
INNER JOIN cas_Person p ON ptr.person_id = p.person_id
INNER JOIN cas_semesters sem ON c.termCode = sem.banner_term_code
AND sem.is_template = 0
LEFT OUTER JOIN cas_person ip ON c.insAnumber = ip.a_num
WHERE
app.approve IS NULL
AND (SELECT COUNT(reject) FROM cas_Approval WHERE eastId = c.id) = 0
AND app.reject IS NULL
AND sem.semester_id = 27
ORDER BY
p.person_id,
app.role_id,
course
UNION子句导致DISTINCT。
博客文章描述你的确切问题:SQL联合和文本数据类型
TEXT不能与DISTINCT
(和其他几个函数)一起使用。在任何情况下,TEXT
都是不赞成的,应该用VARCHAR(MAX)
这样的类型来代替,它允许不同的。
CREATE Table SomeTable
(
TextCol TEXT,
VarCharMaxCol VARCHAR(MAX)
);
GO
--Err: The text data type cannot be selected as DISTINCT because it is not comparable.
SELECT DISTINCT TextCol FROM SomeTable;
-- Works
SELECT DISTINCT VarCharMaxCol FROM SomeTable;
文本字段是为不进行比较或排序的数据设计的。例如,图书馆永远不会把《华氏451度》放在《钟罩》旁边,因为一个开头是"It was a p…",另一个开头是"It was a q…"。
快速解决您的问题:使用UNION ALL
。长期解决方案是不使用text
SELECT CAST('' AS text) UNION SELECT CAST('' AS text)
<——error
SELECT CAST('' AS text) UNION ALL SELECT CAST('' AS text)
<——无错误