2017-09-17 27 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