2

私のMsAccessでは、2つの異なるテーブルからデータを挿入したいので、次のようにSQLを記述します。

SELECT B.*, C.* INTO Table2 FROM Table1 AS A 
RIGHT JOIN ABC AS B ON A.HKID=B.HKID 
RIGHT JOIN DEF AS C ON A.HKID=C.HKID 
WHERE A.HKID Is Null and b.organization not like '*xxx*' and b.adj = 1 and c.[Status] = 'Suspend';"

しかし、SQLの実行時にエラーメッセージが表示され、構文エラーが発生しました。

このようにSQLを書くことはできますか?

4

2 に答える 2

2

複数ある場合JOIN、Accessのdbエンジンでは括弧を使用する必要があります。

SELECT B.*, C.* INTO Table2
FROM
    (Table1 AS A RIGHT JOIN ABC AS B ON A.HKID = B.HKID)
    RIGHT JOIN DEF AS C ON B.HKID = C.HKID
WHERE
        A.HKID Is Null
    AND B.organization Not Like '*xxx*'
    AND B.adj=1
    AND C.Status='Suspend';

私が使用したことに注意してください...

RIGHT JOIN DEF AS C ON B.HKID = C.HKID

あなたがそれを持っていた方法の代わりに...

RIGHT JOIN DEF AS C ON A.HKID=C.HKID

試したときにAccessが「参加はサポートされていません」と文句を言ったため、この変更ON A.HKID=C.HKID を行う必要がありました。それでも不十分な場合は、最初からやり直す必要があります。逆の順序でテーブルを使ってこれに取り組み、を使用すると思いますLEFT JOIN

また、作成するテーブル( )には、とから派生したとTable2という名前のフィールドが含まれます。これらの2つのテーブルに共通する他のフィールド名と同じパターンが表示されます。それが受け入れられない場合は、フィールドを個別にリストし、必要に応じてエイリアスを割り当てることができます。B_HKIDC_HKIDB.HKIDC.HKID

Accessがインストールされている場合は、クエリデザイナでこのクエリを作成する必要があります。これにより、データベースエンジンを満足させるために、結合を適切に設定できるようになります。

Accessがインストールされておらず、ADO接続からこのクエリを実行している場合は、Like文字列パターンのワイルドカード文字をから*に変更し%ます。

AND B.organization Not Like '%xxx%'
于 2012-07-20T05:13:30.463 に答える
0

そのコードは正しくありません

INSERT INTO TABLE2
SELECT B.*, C.* FROM TABLEA AS A
 RIGHT JOIN ABC AS B ON A.HKID=B.HKID
 RIGHT JOIN DEF AS C ON A.HKID=C.HKID
WHERE A.HKID IS NULL and B.ORGANIZATION NOT LIKE '*xxx*' AND B.ADJ = 1 AND C.[STATUS] = 'SUSPEND';

正しい結合について知っていることを願っています。あなたが言っているのは、Aと一致するかどうかに関係なく、CとBからすべてのレコードを返すことです。しかし、Aと一致しない場合は、CとBを返すだけになります。

http://msdn.microsoft.com/en-us/library/bb208861(v=office.12).aspx

選択によって列が指定されるため、挿入で列を指定する必要はありません。

"INSERT INTOを使用して、複数レコードの追加クエリ構文で上記のようにSELECT…FROM句を使用して、別のテーブルまたはクエリからレコードのセットを追加することもできます。この場合、SELECT句は追加するフィールドを指定します。指定されたターゲットテーブル。」

編集:以下のコードは同じことを行うと思いますが、A.HKIDがNULLでない場合は、パフォーマンスも向上する可能性があります。

INSERT INTO TABLE2
SELECT B.*, C.* FROM TABLEA AS A
 INNER JOIN ABC AS B ON A.HKID<>B.HKID
 INNER JOIN DEF AS C ON A.HKID<>C.HKID
WHERE B.ORGANIZATION NOT LIKE '*xxx*' AND B.ADJ = 1 AND C.[STATUS] = 'SUSPEND';
于 2012-07-20T03:57:14.123 に答える