TSQL-不使用游标将一个表映射到另一个表

TSQL-不使用游标将一个表映射到另一个表,tsql,Tsql,我有以下结构的表 create table Doc( id int identity(1, 1) primary key, DocumentStartValue varchar(100) ) create Metadata ( DocumentValue varchar(100), StartDesignation char(1), PageNumber int ) GO Doc c

我有以下结构的表

create table Doc(
    id                  int identity(1, 1) primary key,
    DocumentStartValue  varchar(100)
)
create Metadata (
    DocumentValue       varchar(100),
    StartDesignation    char(1),
    PageNumber          int
)
GO

Doc contains
    id      DocumentStartValue
    1000    ID-1
    1100    ID-5
    2000    ID-8
    3000    ID-9

Metadata contains
    Documentvalue   StartDesignation    PageNumber
    ID-1            D                   0
    ID-2            NULL                1
    ID-3            NULL                2
    ID-4            NULL                3
    ID-5            D                   0
    ID-6            NULL                1
    ID-7            NULL                2
    ID-8            D                   0
    ID-9            D                   0
我需要的是将Metadata.documentValue映射到Doc.id

所以我需要的结果是

id      DocumentValue   PageNumber
1000    ID-1            0
1000    ID-2            1
1000    ID-3            2
1000    ID-4            3
1100    ID-5            0
1100    ID-6            1
1100    ID-7            2
2000    ID-8            0
3000    ID-9            0

不使用光标可以实现吗?

类似“对不起,无法测试”之类的内容

;WITH RowList AS
(   --assign RowNums to each row...
    SELECT
        ROW_NUMBER() OVER (ORDER BY id) AS RowNum,
        id, DocumentStartValue
    FROM
        doc
), RowPairs AS
(   --this allows us to pair a row with the previous rows to create ranges
    SELECT 
       R.DocumentStartValue AS Start, R.id,
       R1.DocumentStartValue AS End
    FROM
       RowList R JOIN RowList R1 ON R.RowNum + 1 = R1.RowNum
)
--use ranges to join back and get the data
SELECT
    RP.id, M.DocumentValue, M.PageNumber
FROM
    RowPairs RP
    JOIN
    Metadata M ON RP.Start <= M.DocumentValue AND M.DocumentValue < RP.End
;以行列表作为
(-将ROWNUM分配给每一行。。。
挑选
(按id排序)上的行号()为RowNum,
id,DocumentStartValue
从…起
医生
),行对为
(-这允许我们将一行与前面的行配对以创建范围
挑选
R.DocumentStartValue作为开始,R.id,
R1.DocumentStartValue作为结束
从…起
行列表R在R.RowNum+1=R1.RowNum上加入行列表R1
)
--使用范围连接并获取数据
挑选
RP.id、M.DocumentValue、M.PageNumber
从…起
行对
参加
元数据M在RP.Start上
尝试使用上面的查询(可能还需要添加
选项(maxrecursion…
),并在元数据表的DocumentValue上添加索引。此外,这是可能的-最好在Metadat行上保存适当的组

UPD:我已经测试了它并修复了查询中的错误,但它并没有像最初的问题那样工作并给出结果

UPD2:和建议的索引:


create clustered index IX_Metadata on Metadata (DocumentValue)
create nonclustered index IX_Doc_StartValue on Doc (DocumentStartValue)

迈斯特-那太难看了。哇,一个矛盾修饰法。是的。但这是我得到的数据。。。不幸的是…我添加了一个小的调整,其中最后一条记录没有显示在您的查询中

create clustered index IX_Metadata on Metadata (DocumentValue)
create nonclustered index IX_Doc_StartValue on Doc (DocumentStartValue)