【问题标题】:how to find unmatched records with multiple match options如何使用多个匹配选项查找不匹配的记录
【发布时间】: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 为空。
  • 我会添加更新。

标签: sql ms-access join


【解决方案1】:

您可以先将 Table_2 和 Cross Join 的行与 Table_1 连接起来。 请试试这个:

SELECT [DP]+[FY]+[BS]+[RD]+[LI] T2Key
into #tmp
FROM [Table_2]

select T1.* from [Table_1] T1
cross join #tmp T2
WHERE T1.[DP]+T1.[FY]+T1.[BS]+T1.[RM]+T1.[EX] <> T2.T2Key
and left(T1.[DP]+T1.[FY]+T1.[BS]+T1.[RM]+T1.[EX],8)+'**'+right(T1.[DP]+T1.[FY]+T1.[BS]+T1.[RM]+T1.[EX],2) <> T2.T2Key
and left(T1.[DP]+T1.[FY]+T1.[BS]+T1.[RM]+T1.[EX],9)+'**'+right(T1.[DP]+T1.[FY]+T1.[BS]+T1.[RM]+T1.[EX],1) <> T2.T2Key
and left(T1.[DP]+T1.[FY]+T1.[BS]+T1.[RM]+T1.[EX],9)+'***' <> T2.T2Key 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多