模拟 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 行没有意义。