【问题标题】:Union Causing The ntext data type cannot be selected as DISTINCT because it is not comparable联合导致 ntext 数据类型无法选择为 DISTINCT,因为它不可比较
【发布时间】:2014-07-01 15:33:19
【问题描述】:

我有两个要联合在一起的查询(由一些临时表组成)。当我用 union out 注释掉一个(无关紧要的)查询时,它就起作用了。但是当我介绍工会时,我得到The ntext data type cannot be selected as DISTINCT because it is not comparable. 我不明白为什么,因为两个主要查询都没有使用不同的。以下是供参考的主要选择:

SELECT  
    dbo.CUSTTABLE.ACCOUNTNUM AS 'Account Number',
    dbo.CUSTTABLE.NAME AS 'Customer Name',
    [DESCRIPTION] AS 'Division',
    ISNULL(dbo.USERINFO.NAME, 'OPEN') AS 'Sales Engineer',
    [STATE],
    PHONE,
    PAYMTERMID AS 'Terms',
    (CASE BLOCKED
        WHEN 0 THEN 'No'
        WHEN 2 THEN 'Financial Hold'
        WHEN 1 THEN 'System Hold'
        ELSE 'Unknown' END) AS 'Status',
    [45-60],
    [61-90],
    [91-120],
    [120+],
    #temptable2.Today,
    ISNULL(USERMEMO, '') AS 'Notes',
    ISNULL(#temptable2.Today / NULLIF((ISNULL(#salesTemp.PQ1, 0) / 90), 0),0) AS 'DSO1',
    CustTable.StatisticsGroup as 'Past Due Category'

FROM
    dbo.CUSTTABLE INNER JOIN 
    dbo.DIMENSIONS ON DIMENSION2_ = NUM INNER JOIN
    #temptable2 ON dbo.CUSTTABLE.ACCOUNTNUM = #temptable2.ACCOUNTNUM LEFT OUTER JOIN
    #temptable ON dbo.CUSTTABLE.ACCOUNTNUM = #temptable.ACCOUNTNUM LEFT OUTER JOIN
    dbo.SMMSALESUNITMEMBERS ON SALESGROUP = SALESUNITID AND SALESMANAGER = 1 LEFT OUTER JOIN
    dbo.USERINFO ON ID = SALESMANID AND [ENABLE] = 1    
    JOIN #salesTemp on #salesTemp.ACCOUNTNUM = CUSTTABLE.ACCOUNTNUM
WHERE
    DIMENSION2_ IN (@division)

UNION
SELECT 
    Customer_ID AS 'Account Number',
    Customer_Name AS 'Customer Name',
    'South Bend' AS Division,
    '' AS 'Sales Engineer',
    'Indiana' AS 'State',
    '' AS 'Phone',
    Customer_Terms AS 'Terms',
    '' AS 'Status',
    [45-60],
    [61-90],
    [91-120],
    [120+],
    [Today],
    '' AS 'Notes',
    '' AS 'DSO1',
    '' AS 'Past Due Category'
FROM #temptable4

【问题讨论】:

  • 默认情况下,union 应用一个 distinct,ntext 不支持。试试UNION ALL(它不会做一个独特的)看看它是否解决了问题。如果是,那么看看每个字段的数据类型是不是ntext?如果是,您可能需要将值转换为 nvarchar(max) social.msdn.microsoft.com/Forums/sqlserver/en-US/…stackoverflow.com/questions/1028061/…
  • Union all 给我“将数据类型 varchar 转换为数字时出错。”在同一个地方。字符字段的数据类型都是 char 或 varchar
  • 数据类型:#temptable2.Today、#salesTemp.PQ1、enable、salesmanager?也可能是 '' AS 'DSO1', 我不确定 SQL 服务器是否将空字符串视为 null,因此无法转换为数字可能需要改为 NULL AS 'DSO1'...事实上...我敢打赌这是最后一部分.
  • 确认我让工会开始工作了。愚蠢的错误。我需要在底部的“DSO1”位置放一个 0。蹩脚
  • 小心你现在不需要工会。我这样做只是为了消除 ntext 的问题,并且引擎返回了一个更好、更具描述性的错误......所以你想要所有记录还是只是不同的?如果只是不同,则使用联合,如果来自两者的所有记录,则联合所有...

标签: sql sql-server


【解决方案1】:

更改:'' AS 'DSO1',NULL as 'DS01',

空集不能在 SQL server 中转换为数值;根据联合的顶部选择中定义的数据类型,这是必需的。

我认为这是问题所在,因为联合中的顶部选择将返回一个数值。由于空集不能转换为数字,请提供数字 (0) 或使用 null。

请记住,在执行联合时,列数必须匹配,并且它们的数据类型必须匹配。如果他们不这样做,您会收到诸如此类的错误。

至于评论,“我不明白为什么因为两个主要查询都没有使用 distinct”UNION 对得到的联合结果执行 distinct。 UNION ALL 不会。这就是 UNION ALL 的执行速度更快的原因,因为它不必执行 UNION 的执行中包含的重复删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多