模拟 ROW_NUMBER in SQL 2000 结合左外连接
Simulate ROW_NUMBER in SQL 2000 combined with left outer joins
我读了几篇文章并阅读了过去的 SO 帖子,但我的查询似乎无法正常工作。
基本上,我试图在具有左外连接的 select 查询中添加一个 RowNumber 列。
奇怪的是,如果我 return 一个字段的查询一切正常。
原始 TSQL:
SELECT TOP 10 a.ACCOUNTID,
ACCOUNT,
a.LASTHISTORYBY,
a.LASTHISTORYDATE,
a.CreateDate,
a.[Type],
[Status],
Email,
Fax,
MainPhone,
WebAddress,
adr.ADDRESSID,
EntityID,
ADDRESS1,
ADDRESS2,
ADDRESS3,
ADDRESS4,
City,
adr.[State],
Postalcode,
County,
Country,
IsPrimary,
adr.CreateDate,
adr.CreateUser,
adr.ModifyDate,
adr.ModifyUser,
htaccount.SCHOOLCLOSED
FROM sysdba.ACCOUNT a
LEFT OUTER JOIN sysdba.[ADDRESS] adr ON a.ADDRESSID = adr.ADDRESSID
LEFT OUTER JOIN sysdba.[HT_ACCOUNT] htaccount ON a.ACCOUNTID = htaccount.ACCOUNTID
显然效果很好,但尝试添加类似的 RowNumber 功能绝对是一件痛苦的事情。当我运行新脚本时RowNumber似乎return变成了9k值。我也看到了重复的值。
TSQL 行号:
SELECT TOP 300 RowNumber,
a.ACCOUNTID,
a.LASTHISTORYBY,
a.LASTHISTORYDATE
FROM (SELECT ACCOUNTID,
LASTHISTORYBY,
LASTHISTORYDATE,
(SELECT count(*) FROM sysdba.ACCOUNT AS t1 WHERE t1.ACCOUNTID <= t2.ACCOUNTID) AS RowNumber FROM sysdba.ACCOUNT AS t2) as a
--LEFT OUTER JOIN sysdba.[ADDRESS] adr ON ADDRESSID = adr.ADDRESSID
--LEFT OUTER JOIN sysdba.[HT_ACCOUNT] htaccount ON a.ACCOUNTID = htaccount.ACCOUNTID
WHERE RowNumber > 50 AND RowNumber < 100
我注释掉了 Left Outer Joins 因为我正在测试但理想情况下需要加入。
如有任何帮助,我们将不胜感激!
此致,
您的 "row count" 应该包含所有相关条件作为主查询(意思是它应该 selected after 左连接)。
试试这个:
CREATE VIEW vw_Base
AS
SELECT a.ACCOUNTID,
ACCOUNT,
a.LASTHISTORYBY,
a.LASTHISTORYDATE,
a.CreateDate,
a.[Type],
[Status],
Email,
Fax,
MainPhone,
WebAddress,
adr.ADDRESSID,
EntityID,
ADDRESS1,
ADDRESS2,
ADDRESS3,
ADDRESS4,
City,
adr.[State],
Postalcode,
County,
Country,
IsPrimary,
adr.CreateDate,
adr.CreateUser,
adr.ModifyDate,
adr.ModifyUser,
htaccount.SCHOOLCLOSED
FROM sysdba.ACCOUNT a
LEFT OUTER JOIN sysdba.[ADDRESS] adr ON a.ADDRESSID = adr.ADDRESSID
LEFT OUTER JOIN sysdba.[HT_ACCOUNT] htaccount ON a.ACCOUNTID = htaccount.ACCOUNTID
GO
SELECT *
FROM
(
SELECT *, (
SELECT COUNT(*)
FROM vwBase t2
WHERE t2.ACCOUNTID <= t1.ACCOUNTID) As RowNumber
FROM vwBase t1
) iq
WHERE RowNumber > 50 AND RowNumber < 100
此外,您的两个 select 语句都缺少 order by 子句。 select没有排序的前 x 行没有意义。
我读了几篇文章并阅读了过去的 SO 帖子,但我的查询似乎无法正常工作。
基本上,我试图在具有左外连接的 select 查询中添加一个 RowNumber 列。
奇怪的是,如果我 return 一个字段的查询一切正常。
原始 TSQL:
SELECT TOP 10 a.ACCOUNTID,
ACCOUNT,
a.LASTHISTORYBY,
a.LASTHISTORYDATE,
a.CreateDate,
a.[Type],
[Status],
Email,
Fax,
MainPhone,
WebAddress,
adr.ADDRESSID,
EntityID,
ADDRESS1,
ADDRESS2,
ADDRESS3,
ADDRESS4,
City,
adr.[State],
Postalcode,
County,
Country,
IsPrimary,
adr.CreateDate,
adr.CreateUser,
adr.ModifyDate,
adr.ModifyUser,
htaccount.SCHOOLCLOSED
FROM sysdba.ACCOUNT a
LEFT OUTER JOIN sysdba.[ADDRESS] adr ON a.ADDRESSID = adr.ADDRESSID
LEFT OUTER JOIN sysdba.[HT_ACCOUNT] htaccount ON a.ACCOUNTID = htaccount.ACCOUNTID
显然效果很好,但尝试添加类似的 RowNumber 功能绝对是一件痛苦的事情。当我运行新脚本时RowNumber似乎return变成了9k值。我也看到了重复的值。
TSQL 行号:
SELECT TOP 300 RowNumber,
a.ACCOUNTID,
a.LASTHISTORYBY,
a.LASTHISTORYDATE
FROM (SELECT ACCOUNTID,
LASTHISTORYBY,
LASTHISTORYDATE,
(SELECT count(*) FROM sysdba.ACCOUNT AS t1 WHERE t1.ACCOUNTID <= t2.ACCOUNTID) AS RowNumber FROM sysdba.ACCOUNT AS t2) as a
--LEFT OUTER JOIN sysdba.[ADDRESS] adr ON ADDRESSID = adr.ADDRESSID
--LEFT OUTER JOIN sysdba.[HT_ACCOUNT] htaccount ON a.ACCOUNTID = htaccount.ACCOUNTID
WHERE RowNumber > 50 AND RowNumber < 100
我注释掉了 Left Outer Joins 因为我正在测试但理想情况下需要加入。
如有任何帮助,我们将不胜感激!
此致,
您的 "row count" 应该包含所有相关条件作为主查询(意思是它应该 selected after 左连接)。
试试这个:
CREATE VIEW vw_Base
AS
SELECT a.ACCOUNTID,
ACCOUNT,
a.LASTHISTORYBY,
a.LASTHISTORYDATE,
a.CreateDate,
a.[Type],
[Status],
Email,
Fax,
MainPhone,
WebAddress,
adr.ADDRESSID,
EntityID,
ADDRESS1,
ADDRESS2,
ADDRESS3,
ADDRESS4,
City,
adr.[State],
Postalcode,
County,
Country,
IsPrimary,
adr.CreateDate,
adr.CreateUser,
adr.ModifyDate,
adr.ModifyUser,
htaccount.SCHOOLCLOSED
FROM sysdba.ACCOUNT a
LEFT OUTER JOIN sysdba.[ADDRESS] adr ON a.ADDRESSID = adr.ADDRESSID
LEFT OUTER JOIN sysdba.[HT_ACCOUNT] htaccount ON a.ACCOUNTID = htaccount.ACCOUNTID
GO
SELECT *
FROM
(
SELECT *, (
SELECT COUNT(*)
FROM vwBase t2
WHERE t2.ACCOUNTID <= t1.ACCOUNTID) As RowNumber
FROM vwBase t1
) iq
WHERE RowNumber > 50 AND RowNumber < 100
此外,您的两个 select 语句都缺少 order by 子句。 select没有排序的前 x 行没有意义。