【发布时间】:2017-09-17 19:24:47
【问题描述】:
在 MS Access 中。我有两张桌子。我正在尝试查找表 1 中与表 2 不匹配的所有记录。
Table 1
DP FY BS RM EX
--------------------------------
21 1 0107 0 3000
20 R 0201 6 3960
12 3 0165 A 1111
Table 2
DP FY BS RD LI
-------------------------------
11 4 0300 0 **11
21 5 0107 7 8**W
97 7 0819 0 2***
21 4 0107 7 2011
我需要连接 Table1.DP + Table1.FY + Table1.BS + Table1.RM + Table1.EX 并在 Table1 中找到 Table2.DP + Table2.FY + Table2 列上 table2 中没有 MATCH 的任何记录.BS + Table2.RD + Table2.LI。
我也不需要对 table2.LI 的一些子字符串进行匹配,它们将包含星号(不是通配符,实际星号)。
Table2.LI 的左侧 2 个字符可能是星号,在这种情况下,我想在结果中返回该行,
Table2.LI 的中间 2 个字符可能是星号,在这种情况下,我想在结果中返回该行。
Table2.LI 的最后 3 个字符可能是星号,在这种情况下,我想在结果中返回该行。
所以,如果我们要将 5 个关键字段连接到一个名为 Key 的 12 个字符的文本字段中,我想要一个查询,该查询将返回 Table1 中的所有结果,其中
Table1.Key <> Table2.Key
Left(Table1.Key,8) + "**" + Right(Table1.Key,2) <> Table2.Key
Left(Table1.Key,9) + "**" + Right(Table1.Key,1) <> Table2.Key
Left(Table1.Key,9) + "***" <> Table2.Key
基本上,在那些 Table2.LI 的子字符串中有星号的情况下,我不在乎 Table1.EX 中这些位置的内容。
我如何编写一个 SQL 语句来给我那些 UNMATCHED 查询的结果,我只得到表 1 的结果,而表 2 中的这些条件不匹配?我可以编写查询以将字段中的星号作为通配符进行比较吗?
更新:在构建关键字段后,我能够通过在关键字段中用问号替换星号来解决问题。然后在 join 子句上使用“like”而不是 equals 进行左连接。现在我有一个新发现的问题。 LI 字段中有两种情况,但我不希望它们转换为问号,因为我不希望它们被视为通配符。
这些是我想要改变的条件。表2.LI =
**XX
X**X
X***
这些是我不想变成通配符的条件:Table2.LI =
****
X*XX
(其中 X 是任意数字或字母)。
我可以通过添加一个 where 子句来解决第一个问题,即 where Table2.LI NOT CONTAINS("****")。现在我只是想解决最后一个条件。我只需要检查 LI 字段中第二个位置的星号,然后忽略这种情况。
【问题讨论】:
-
你尝试了什么?
-
我找到了一种方法,将 table2.LI 中的星号替换为问号。然后 Access 将问号视为通配符,我正在对 LIKE 键(而不是 =)进行左连接。其中 table2.key 为空。
-
我会添加更新。