【问题标题】:Concatenating column values with distinct gets strange result [duplicate]连接具有不同的列值会得到奇怪的结果[重复]
【发布时间】:2016-11-29 15:01:04
【问题描述】:

我有一个简单的包含两个值的单列表。我选择它并使用 distinct 修饰符连接值,但它只是获得最新值。我对 DISTINCT 有误解吗?

DECLARE @table TABLE(Id int) 
DECLARE @result VARCHAR(MAX) = ''

INSERT @table VALUES(1), (2)

SELECT 
    @result = @result + CAST( Id AS VARCHAR(10)) + ','
FROM 
    @table

SELECT @result  --— output: 1,2,

-------same With distinct
SET @result = ''

SELECT DISTINCT @result = @result 
        + CAST( Id AS VARCHAR(10)) + ','
FROM @table
SELECT @result  --— expected output: 1,2, actual output: 2,    why?

【问题讨论】:

    标签: sql sql-server tsql concatenation distinct


    【解决方案1】:

    快速查看执行计划(以及一些玩弄)告诉我 SELECT DISTINCT 也排序,因此你得到最大的 id。

    例如,在

    INSERT @table VALUES(1),(2),(1),(4), (2), (3)
    

    我会得到结果 4(因为 4 是最高的)。

    解决方案?将“distinct”放在这样的子查询中:

    SELECT     
        @result = @result 
            + CAST( Id AS VARCHAR(10)) + ','
    FROM
        (SELECT DISTINCT id
         FROM @table) Q
    

    导致:1、2、3、4,

    【讨论】:

    • 这其实很有趣。我从来没有调查过,但这似乎是GROUP BYDISTINCT 的区别。执行计划改变了它计算变量值的顺序...
    • 谢谢,我知道 Concatenate operator + 充当聚合函数,但为什么 concatenate operator with Distinct 充当 Max()?
    • 您的重写仍然依赖于依赖于执行计划且无法保证的行为。唯一安全的方法是使用其他方法,例如xml path
    • @Mohammadreza - 不知道,我试过了,这就是我所拥有的 :) 我看到了关于“排序”的注释,这就是我认为它发生的原因。
    猜你喜欢
    • 2018-03-08
    • 2022-01-25
    • 2020-10-08
    • 1970-01-01
    • 2011-08-04
    • 2021-03-17
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    相关资源
    最近更新 更多