应该使用什么查询,如果我有一个要转换的数据集
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表。