2015-10-16 124 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行,取決於您加入的數據。內連接中的 –