如何使用多个匹配选项查找不匹配的记录

时间:2017-09-17 19:24:47

标签: sql ms-access join

在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中查找表2中的任何记录,其中表2中的列没有MATCH。表2.DP + Table2.FY + Table2 .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字段中有星号,但我不希望它们转换为问号,因为我不希望它们被视为通配符。

这些是我想要改变的条件。 Table2.LI =

**XX
X**X
X***

这些是我不想变成通配符的条件:Table2.LI =

****
X*XX

(其中X是任何数字或字母)。

我能够通过添加where子句来解决第一个问题,该子句说明Table2.LI NOT CONTAINS(“****”)。现在我只是想解决最后一个条件。我需要在第二个位置检查LI字段是否有星号,并忽略该情况。

1 个答案:

答案 0 :(得分:0)

您可以先使用Table_1将表__2和Cross Join的行整合在一起。 请试试这个:

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