Row_Number() 返回重复行

Row_Number() returning duplicate rows

这是我的查询,

SELECT top 100
    UPPER(COALESCE(A.DESCR,C.FULL_NAME_ND)) AS DESCR,
    COALESCE(A.STATE, (SELECT TOP 1 STATENAME 
                       FROM M_STATEMASTER 
                       WHERE COUNTRYCODE = B.CODE)) AS STATENAME,
    COALESCE(A.STATECD, (SELECT TOP 1 CODE 
                         FROM M_STATEMASTER 
                         WHERE COUNTRYCODE = B.CODE)) AS STATECD,
    COALESCE(A.COUNTRYCD, B.CODE) AS COUNTRYCODE
FROM 
    M_CITY A
JOIN 
    M_COUNTRYMASTER B ON A.COUNTRYCD = B.CODE
JOIN 
    [GEODATASOURCE-CITIES-FREE] C ON  B.ALPHA2CODE = C.CC_FIPS
WHERE 
    EXISTS (SELECT 1 
            FROM [GEODATASOURCE-CITIES-FREE] Z 
            WHERE B.ALPHA2CODE=Z.CC_FIPS) 
ORDER BY 
    A.CODE

工作正常,但是当我尝试获取 Row_number() over(order by a.code) 时,我多次获取重复的列。

例如

SELECT top 100
    UPPER(COALESCE(A.DESCR,C.FULL_NAME_ND)) AS DESCR,
    COALESCE(A.STATE, (SELECT TOP 1 STATENAME 
                       FROM M_STATEMASTER 
                       WHERE COUNTRYCODE = B.CODE)) AS STATENAME,
    COALESCE(A.STATECD, (SELECT TOP 1 CODE 
                         FROM M_STATEMASTER 
                         WHERE COUNTRYCODE = B.CODE)) AS STATECD,
    COALESCE(A.COUNTRYCD, B.CODE) AS COUNTRYCODE
    ROW_NUMBER() OVER(ORDER BY A.CODE) AS RN -- i made a change here
FROM 
    M_CITY A
JOIN 
    M_COUNTRYMASTER B ON A.COUNTRYCD = B.CODE
JOIN 
    [GEODATASOURCE-CITIES-FREE] C ON  B.ALPHA2CODE = C.CC_FIPS
WHERE 
    EXISTS (SELECT 1 
            FROM [GEODATASOURCE-CITIES-FREE] Z 
            WHERE B.ALPHA2CODE=Z.CC_FIPS) 
ORDER BY 
    A.CODE
WHERE 
    EXISTS (SELECT 1 
            FROM [GEODATASOURCE-CITIES-FREE] Z 
            WHERE B.ALPHA2CODE = Z.CC_FIPS)

再试一次,当我使用 ROW_NUMBER() OVER(ORDER BY newid()) AS RN 时,它需要 logn 时间来执行。

记住:CODE是tableM_CITY的Pk,[GEODATASOURCE-CITIES-FREE]table.

中没有key

另一件事:关于 JOIN(inner join),Join returns 匹配的 Rows,对吗???

例如:

table 1 with 20 rows,
table2 with 30 rows ,
table 3 with 30 rows

如果我在某个键上加入这 3 个 table 那么获得最大行数的可能性是 20,对吗?

您的第一个查询不正常。它只是看起来。原因是您使用的 TOP 没有 ORDER BY,因此返回任意一组 100 行。

添加 ROW_NUMBER() 后,查询计划会发生变化。 . .结果集的顺序也会发生变化。我建议您修复原始查询以使用稳定排序。