2017-09-17 13 views
1

MS Access。私は2つのテーブルを持っています。私は表に一致していない。表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を連結する必要が

Table2.DP + Table2.FY + Table2.BS + Table2.RD + Table2.LIの列にtable2に一致がないTable1のレコードを検索します。

また、表2.LIのいくつかの部分文字列には、アスタリスク(ワイルドカード、実際のアスタリスクではありません)が含まれています。

Table2.LIの左2つの文字が、私は私の結果にその行を返したい、その場合には、アスタリスク、Table2.LIの

真ん中の2つの文字は、私がしたい、その場合にはアスタリスク、可能性があることができその行を結果に戻します。

Table2.LIの最後の3文字はアスタリスクである可能性があります。この場合、結果にその行を戻したいと思います。

我々はキーという名前の12文字のテキストフィールドに5つのキーフィールドを連結した場合ので、私はそこにそれらのインスタンスでは、基本的に

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 

表1からすべての結果を返しますクエリをしたいですTable2.LIの部分文字列にアスタリスクがありますが、私はこれらの位置にTable1.EXが何であるか気にしません。

表2のこれらの条件に一致していない表1の結果しか得られないUNMATCHEDクエリの結果を私に与えるためにSQL文を書くにはどうすればよいですか?比較のためにワイルドカードとしてフィールド内のアスタリスクを確認するクエリを記述できますか?

更新:キーフィールドを作成した後で、アスタリスクをキーフィールドの疑問符に置き換えることで問題を解決できました。次に、等価ではなく結合節で「好き」を使用して左結合を実行します。今私は新たに発見された問題があります。 LIフィールドにアスタリスクがある2つの条件がありますが、それらをワイルドカードとして見せたくないので疑問符に変換したくありません。

これらは私が変更したい条件です。 Table2.LI =

**** 
X*XX 

(Xは任意の数字または文字):Table2.LI =

**XX 
X**X 
X*** 

これらは私がワイルドカードに変えることにしたくない条件です。

Where 2. Where is where節を追加するだけで、最初の問題を解決することができました。どこにTable2.LI NOT CONTAINS( "****")がありますか?今私は最後の状態を解決しようとしています。 2番目の位置のアスタリスクだけLIフィールドをチェックして、そのケースを無視する必要があります。

+0

何を試しましたか? – blueCat

+0

私はtable2.LIのアスタリスクを疑問符に置き換えることでそれを行う方法を見つけました。Accessは疑問符をワイルドカードとして認識し、LIKEキー(=ではなく)を左結合します。ここで、table2.keyはnullです。 – 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 
関連する問題