对于那里的 SQL“纯粹主义者”,这里有一种无需 VBA 的方法。给定一个名为 [tblData] 的实际数据表
ID year_single make model color
-- ----------- --------------- ------- ----------
1 79-80 American Motors AMX Amber
2 79-83 American Motors Concord ColorSHIFT
以及包含填充文本可能变化的表格:
[tblFiller1]
Filler1
-------------
Oracle
Oracle Lights
[tblFiller2]
Filler2
--------
4x6"
4x6" LED
和 [tblFiller3]
Filler3
------------------------
Halo 2 Sealed Headlights
我们可以创建一个名为 [qryDescriptOptions] 的已保存 Access 查询
SELECT
ID,
Len(Descrip) AS DescripLen,
Descrip
FROM
(
SELECT
ID,
Filler1 & IIf(Len(Nz(Filler1,""))>0," ","") &
year_single & " " & make & " " & model &
IIf(Len(Nz(Filler2,""))>0," ","") & Filler2 &
" " & color &
IIf(Len(Nz(Filler3,""))>0," ","") & Filler3
AS Descrip
FROM
tblData, tblFiller1, tblFiller2, tblFiller3
)
它在表上使用交叉连接来为我们提供所有排列:
ID DescripLen Descrip
-- ---------- ----------------------------------------------------------------------------------------
1 61 79-80 American Motors AMX 4x6" Amber Halo 2 Sealed Headlights
2 70 79-83 American Motors Concord 4x6" ColorSHIFT Halo 2 Sealed Headlights
1 65 79-80 American Motors AMX 4x6" LED Amber Halo 2 Sealed Headlights
2 74 79-83 American Motors Concord 4x6" LED ColorSHIFT Halo 2 Sealed Headlights
1 68 Oracle 79-80 American Motors AMX 4x6" Amber Halo 2 Sealed Headlights
2 77 Oracle 79-83 American Motors Concord 4x6" ColorSHIFT Halo 2 Sealed Headlights
1 72 Oracle 79-80 American Motors AMX 4x6" LED Amber Halo 2 Sealed Headlights
2 81 Oracle 79-83 American Motors Concord 4x6" LED ColorSHIFT Halo 2 Sealed Headlights
1 75 Oracle Lights 79-80 American Motors AMX 4x6" Amber Halo 2 Sealed Headlights
2 84 Oracle Lights 79-83 American Motors Concord 4x6" ColorSHIFT Halo 2 Sealed Headlights
1 79 Oracle Lights 79-80 American Motors AMX 4x6" LED Amber Halo 2 Sealed Headlights
2 88 Oracle Lights 79-83 American Motors Concord 4x6" LED ColorSHIFT Halo 2 Sealed Headlights
所以查询
SELECT
ID,
MAX(DescripLen) AS MaxOfDescripLen
FROM qryDescripOptions
WHERE Descriplen<=80
GROUP BY ID
为我们提供仍然适合 80 个字符的每个 ID 的最长描述长度
ID MaxOfDescripLen
-- ---------------
1 79
2 77
现在我们可以将它加入到我们保存的查询中以检索实际描述
SELECT
q.ID,
q.Descrip
FROM
qryDescripOptions q
INNER JOIN
(
SELECT
ID,
MAX(DescripLen) AS MaxOfDescripLen
FROM qryDescripOptions
WHERE Descriplen<=80
GROUP BY ID
) maxlen
ON q.ID = maxlen.ID AND q.DescripLen = maxlen.MaxOfDescripLen
生产
ID Descrip
-- -------------------------------------------------------------------------------
1 Oracle Lights 79-80 American Motors AMX 4x6" LED Amber Halo 2 Sealed Headlights
2 Oracle 79-83 American Motors Concord 4x6" ColorSHIFT Halo 2 Sealed Headlights
在这种特殊情况下,给定 ID 的 MaxOfDescriptLen 值上的“tie”不会导致重复,但为了防止这种可能性,我们会将整个事情包装在一个聚合查询中
SELECT
ID,
MIN(Descrip) AS Description
FROM
(
SELECT
q.ID,
q.Descrip
FROM
qryDescripOptions q
INNER JOIN
(
SELECT
ID,
MAX(DescripLen) AS MaxOfDescripLen
FROM qryDescripOptions
WHERE Descriplen<=80
GROUP BY ID
) maxlen
ON q.ID = maxlen.ID AND q.DescripLen = maxlen.MaxOfDescripLen
)
GROUP BY ID