2017-09-17 77 views
1

在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中找到Table1中没有MATCH的任何记录Table2.DP + Table2.FY + Table2.BS + Table2.RD + Table2.LI。

我也不需要匹配table2.LI的几个子字符串,它们将包含星号(不是通配符,实际星号)。

Table2.LI的左侧2个字符可能是星号,在这种情况下,我想返回该行中我的结果,

中间2个Table2.LI的字符可能是星号,在这种情况下,我想在结果中返回该行。

Table2.LI的最后3个字符可能是星号,在这种情况下,我想在结果中返回该行。

所以,如果我们以连接5个关键领域为名为key一个12字符的文本字段,我希望有一个查询,将返回所有结果从表1,其中

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中的条件没有MATCH关系?我可以编写查询来查看字段中的星号作为通配符进行比较吗?

更新:我能够通过在构建关键字段之后用关键字段中的问号替换星号来解决问题。然后在join子句中使用“like”进行左连接,而不是使用equals。现在我有一个新发现的问题。有两种情况,LI字段中有星号,但我不希望它们转换为问号,因为我不希望它们被看作通配符。

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

**XX 
X**X 
X*** 

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

**** 
X*XX 

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

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

+0

你试过了什么? – blueCat

+0

我发现了一种方法来做到这一点,用问号标记替换table2.LI中的星号。然后Access将问号看作通配符,我正在对关键的LIKE键(而不是=)进行左连接。其中table2.key为空。 – Nina

+0

我将添加更新。 – Nina

回答

0

您可以先将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