Microsoft Jet数据库引擎中的数据转换



应该使用什么查询,如果我有一个要转换的数据集

From | To | Val1 | Val2 | Val3
123 130 AB  DE  EF
131 140 WS  ED  RF
141 145 GT  HY  JU

我想在Microsoft Jet数据库引擎或MS Access中打印以下数据集。

ID | Val1 | Val2 | Val3
123 AB  DE  EF
124 AB  DE  EF
125 AB  DE  EF
126 AB  DE  EF
127 AB  DE  EF
128 AB  DE  EF
129 AB  DE  EF
130 AB  DE  EF
131 WS  ED  RF
132 WS  ED  RF
133 WS  ED  RF
134 WS  ED  RF
135 WS  ED  RF
136 WS  ED  RF
137 WS  ED  RF
138 WS  ED  RF
139 WS  ED  RF
140 WS  ED  RF
141 GT  HY  JU
142 GT  HY  JU
143 GT  HY  JU
144 GT  HY  JU
145 GT  HY  JU

这适用于SQL-Server,但不确定在使用访问时如何使用此技术。

create table #t (F_Val int, 
To_Val int, 
Val1 varchar(5), 
Val2 varchar(5), 
Val3 varchar(5)
)
insert into #t values
(123, 130, 'AB', 'DE', 'EF'),
(131, 140, 'WS', 'ED', 'RF'),
(141, 145, 'GT', 'HY', 'JU')
;with ct as (
select ROW_NUMBER() over (ORDER BY object_id) as RN
from sys.objects
)
select RN, #t.Val1, #t.Val2, #t.Val3
from ct
inner join #t on ct.RN between #t.F_Val and #t.To_Val

juts注意到数据库中sys.objects的数量是有限的,所以这不会适用于更大的范围,但我们的想法是这样的。

使用以下SQL:创建并保存查询qdxFactor

SELECT DISTINCT 
[Tens]+[Ones] AS Factor, 
10*Abs([Deca].[id] Mod 10) AS Tens, 
Abs([Uno].[id] Mod 10) AS Ones
FROM 
MSysObjects AS Uno, 
MSysObjects AS Deca;

然后创建一个笛卡尔查询:

Select
[From] + Factor As ID,
Val1,
Val2,
Val3
From
YourTable,
qdxFactor
Where
[From] + Factor <= [To]

据我所知,您的数据集在日期范围内有两个日期;起始日期和结束日期。您试图为日期范围内的所有日期创建记录。

表联接方法是最简单的,但必须有一个包含ID字段所有可能值的新表。因此,在您发布的示例中,您需要一个具有单列ID的表,该表包含从123到145的22条记录。但我想在现实生活中,你的数据集可能要大得多——这没关系,只是有时更难创建。让我们称之为ID表。

在选择查询中,使用联接子句SQL语法将ID表联接到表1:[表1]。[From]>=[ID表]。[ID]与[表1]。[To]<=[ID表]。[ID]。

如果您的ID范围非常大,基本上是无限的,那么就需要一种不同的方法来动态增加ID值。这可能很慢。一种更有效的变体可以是为查询时所需的范围集动态创建所需的ID表。

最新更新