使用来自其他2个表的数据创建表

时间:2013-07-24 09:02:19

标签: sql vba ms-access access-vba

我正在访问并利用VBA进行查询,因为我有变量名,所以我无法在访问中使用查询向导

我有以下2个表格:

tblKabelInfo

一个名称因程序中的其他内容而异的表格

tblName1 as String

表格如下:

tblKabelInfo:

+--------------+----------+----------+----------+
| Kabelnummer  |   data   |more data |even more |           
+--------------+----------+----------+----------+
| 1            |    x     |    x     |    x     |
+--------------+----------+----------+----------+
| 2            |    x     |    x     |    x     |
+--------------+----------+----------+----------+
| 3            |    x     |    x     |    x     |
+--------------+----------+----------+----------+
| 4            |    x     |    x     |    x     |
+--------------+----------+----------+----------+

tblName1:

+--------------------------------+----------+----------+
| Filename                       |   bla    | databla  |
+--------------------------------+---------------------+
|\850\850nm_Lessenaar 1_0001.SOR |    x     |    x     |
+--------------------------------+----------+----------+
|\850\850nm_Lessenaar 1_0002.SOR |    x     |    x     |
+--------------------------------+----------+----------+
|\850\850nm_Lessenaar 1_0003.SOR |    x     |    x     |
+--------------------------------+----------+----------+
|\850\850nm_Lessenaar 1_0004.SOR |    x     |    x     |
+--------------------------------+----------+----------+

我知道两个表的大小相同(所以如果表“tblName1”上升到0234.SOR,我知道来自“tblKabelInfo”的Kabelnummer也会上升到234)

我想创建一个查询,使新表看起来像这样:

NewTable:

+--------------------------------+--------------+-----+--------+-----------+---------+
| Filename                       |KabelNummer   | bla |databla | More Data |Even more|
+--------------------------------+--------------+--------------+-----------+---------+
|\850\850nm_Lessenaar 1_0001.SOR | 1            |  x  |   x    |     x     |    x    |
+--------------------------------+--------------+-----+--------+-----------+---------+
|\850\850nm_Lessenaar 1_0002.SOR | 2            |  x  |   x    |     x     |    x    |
+--------------------------------+--------------+-----+--------+-----------+---------+
|\850\850nm_Lessenaar 1_0003.SOR | 3            |  x  |   x    |     x     |    x    |
+--------------------------------+--------------+-----+--------+-----------+---------+
|\850\850nm_Lessenaar 1_0004.SOR | 4            |  x  |   x    |     x     |    x    |
+--------------------------------+--------------+-----+--------+-----------+---------+

我想在1个表中有2个表,并且共同的因素是“Filename”的结尾应该与“KabelNummer”相同

3 个答案:

答案 0 :(得分:1)

试试这个

INSERT INTO tableNew
SELECT B.Filename,
       A.Kabelnummer,
       B.bla,
       B.databla,
       A.data,
       A.[more data],
       A.[even more]
FROM tblKabelInfo A INNER JOIN tblName1  B
ON A.Kabelnummer=CAST(RIGHT(SUBSTRING( B.Filename,1,LEN(SUBSTRING( B.Filename, 0, PATINDEX('%.%', B.Filename)) + '.') - 1),4)

更新以处理文件名中的4位数字。 00019999

您的查询(编辑)

INSERT INTO tableNew
SELECT B.[Filename],
   A.[Vezelnummer],
   B.[tblVerlies1_Verlies],
   B.[tblVerlies2_Verlies],
   A.[KabelNaam],
   A.[Van],
   A.[Naar],
   A.[VezelLengte],
   A.[TypeKabel],
   A.[TypeConnector],
   A.[AantalConnectoren],
   A.[AantalLassen]
 FROM tblKabelInfo A INNER JOIN tbl_GL_850  B
ON A.Vezelnummer=CAST(RIGHT(SUBSTRING(B.[Filename],1,LEN(SUBSTRING(B.[Filename], 0, PATINDEX('%.%',B.[Filename])) + '.') - 1),4) AS INT)

答案 1 :(得分:1)

SELECT t.Filename,T.bla,T.databla,K.MoreData,K.EvenMore
INTO 
[New Table Name]
FROM tblName1 as T
inner join tblKabelInfo as K
ON CAST(SUBSTRING(T.Filename,[length of filename upto number],1)AS INT)= K.KabelNummer;

没有经过测试但是会有这些内容,我建议您select into查看here

答案 2 :(得分:1)

此处的基本挑战似乎是识别tblName1.Filename中的数字,然后可以使用这些数字与tblKabelInfo.Kabelnummer结合。

如果这些数字始终是字符串最后8个字符中的前4个,则可以使用与Access SQL兼容的RightLeft来轻松获取它们。

这是立即窗口中的会话。

Filename = "\850\850nm_Lessenaar 1_0001.SOR"
? Right(Filename, 8)
0001.SOR
? Left(Right(Filename, 8), 4)
0001

如果您需要将这些字符转换为数字值,可以使用Val函数。

? Val(Left(Right(Filename, 8), 4))
 1 

但是,如果Filename值变量更大,并不总是以句点和3个字符结尾,则任务将更具挑战性。

Filename = "\850\850nm_Lessenaar 1_0001.ABCDEF"
? InstrRev(Filename, "_")
 23 
? InstrRev(Filename, ".")
 28 
? Mid(Filename, InstrRev(Filename, "_") + 1, _
    (InstrRev(Filename, ".") - InstrRev(Filename, "_")) - 1)
0001
? Val(Mid(Filename, InstrRev(Filename, "_") + 1, _
    (InstrRev(Filename, ".") - InstrRev(Filename, "_")) - 1))
 1 

一旦您计算出适当的功能组合以获得所需功能,您就可以在Access查询中使用它们。这是使用这两种方法的查询。它使用 tblName1 中的示例数据在Access 2007中无错误地运行。

SELECT
    t.Filename,
    Val(Left(Right(Filename, 8), 4)) AS Kabelnummer1,
    Val(
            Mid(
                Filename,
                InstrRev(Filename, "_") + 1,
                (InstrRev(Filename, ".") - InstrRev(Filename, "_")) - 1
            )
        ) AS Kabelnummer2
FROM tblName1 AS t;