在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字段是否有星号,并忽略该情况。
答案 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