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)