2015-10-16 90 views
0

这是我的查询,ROW_NUMBER()返回重复的行

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)我得到的重复列多的时间。

e.g

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是表M_CITY的Pk,[GEODATASOURCE-CITIES-FREE]表中没有密钥。

另一件事:关于JOIN(内连接),Join返回匹配的行,右?

e.g:

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

如果我加入了这3个表上的某个键,然后获得最大行的可能性是20,对吗?

+0

你可以得到0到20 * 30 * 30 = 18,000行之间的任何地方。这取决于数据。 –

回答

1

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

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

+0

是的,谢谢。 –

+0

你能解释一下我在我的问题中提到的加入吗? –

+0

不可以。您可能会得到20 x 30 x 30 = 18,000行,取决于您加入的数据。内连接中的 –