为什么两个查询的结果不同

时间:2013-12-05 13:29:52

标签: sql sql-server-2005

第一个查询:

  SELECT  u.id , prop1.id   
   FROM    ( SELECT    '9fbc6e9b59504c08ac643752c1e2d033' AS id ,
                    '|6813dbbfec6241a19b8d2316d2cb2a65,1|' AS customprop
          UNION
          SELECT    'f2271c45682f45fc84527c4afff0ab16' AS id ,
                    '|6813dbbfec6241a19b8d2316d2cb2a65,2|' AS customprop
        ) u
        INNER JOIN ( SELECT ROW_NUMBER() OVER ( ORDER BY a.Id ) id ,
                            A.Id propId ,
                            B.NAME
                     FROM   ( SELECT    '6813dbbfec6241a19b8d2316d2cb2a65' AS id ,
                                        CONVERT(XML, '<v>1,职业资格1</v><v>2,职业资格2</v>') AS value
                            ) A
                            OUTER APPLY ( SELECT    Name = N.v.value('.',
                                                              'nvarchar(Max)')
                                          FROM      A.[VALUE].nodes('/v') N ( v )
                                        ) B
                   ) prop1 ON CHARINDEX('|' + prop1.propid + ','
                                        + CONVERT(NVARCHAR(10), prop1.id)
                                        + '|', u.customprop) > 0
GROUP BY u.id ,
        prop1.id

第二个查询:

SELECT  u.id ,prop1.id, count(*)
    FROM    ( SELECT    '9fbc6e9b59504c08ac643752c1e2d033' AS id ,
                        '|6813dbbfec6241a19b8d2316d2cb2a65,1|' AS customprop
              UNION
              SELECT    'f2271c45682f45fc84527c4afff0ab16' AS id ,
                        '|6813dbbfec6241a19b8d2316d2cb2a65,2|' AS customprop
            ) u
            INNER JOIN ( SELECT ROW_NUMBER() OVER ( ORDER BY a.Id ) id ,
                                A.Id propId ,
                                B.NAME
                         FROM   ( SELECT    '6813dbbfec6241a19b8d2316d2cb2a65' AS id ,
                                            CONVERT(XML, '<v>1,职业资格1</v><v>2,职业资格2</v>') AS value
                                ) A
                                OUTER APPLY ( SELECT    Name = N.v.value('.',
                                                                  'nvarchar(Max)')
                                              FROM      A.[VALUE].nodes('/v') N ( v )
                                            ) B
                       ) prop1 ON CHARINDEX('|' + prop1.propid + ','
                                            + CONVERT(NVARCHAR(10), prop1.id)
                                            + '|', u.customprop) > 0
    GROUP BY u.id ,
            prop1.id

sql可以直接在sqlserver 2005上执行。 第一个查询可以生成一个项目,第二个查询生成两个项目。 我认为这两个查询都应该生成两个项目。 我已经三天了,我真的很想知道为什么。 我是中国人,我的英语很差。我希望你能理解我的描述

2 个答案:

答案 0 :(得分:1)

问题很严重,但问题在于这一行:

INNER JOIN ( SELECT ROW_NUMBER() OVER ( ORDER BY a.Id ) id ,

ORDER BY是不明确的,因此,如果它被执行多次(可能是因为它包含在INNER JOIN中),它可能并不总是返回相同的排序/赋值。这可能导致后一个连接条件仅匹配一个记录而不是两个,这就是用于没有count(*)列的版本的查询计划中发生的情况。

要解决此问题,您只需添加一些内容即可使订购分配独一无二,如下所示:

INNER JOIN ( SELECT ROW_NUMBER() OVER ( ORDER BY a.Id, B.Name ASC ) id ,

尝试这样,它应该有用。

答案 1 :(得分:0)

你的问题在于ROW_NUMBER的ORDER BY子句 - 因为a.ID不是唯一的,结果是不可预测的。让它独一无二,你的问题就会消失 - 你可以使用像

这样的东西
...SELECT ROW_NUMBER() OVER ( ORDER BY newid() ) id...