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()
后,查询计划会发生变化。 . .结果集的顺序也会发生变化。我建议您修复原始查询以使用稳定排序。
这是我的查询,
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.
另一件事:关于 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()
后,查询计划会发生变化。 . .结果集的顺序也会发生变化。我建议您修复原始查询以使用稳定排序。