web-dev-qa-db-ja.com

エントリが別のテーブルに存在しない場合、レコードをテーブルに挿入します-追加のひねりを加えます

SQLsuperherosの皆さん、こんにちは。差し迫った災害から私を救い出し、破滅させることはできますか?

Microsoft Access SQLを使用しています。次のように、あるテーブル(table1)のレコードを選択し、別のテーブル(table2)には表示されないようにして、table1のレコードに基づく新しいレコードをtable2に挿入します。

[表1] file_index:ファイル名

[表2] file_index:celeb_name

したい:

[filename]がaudであり、対応する[file_index]値がtable2に存在せず、フィールド[celeb_name] = 'Audrey Hepburn'を持つtable1からすべてのレコードを選択します

その選択で、新しいレコードを[table2]に挿入します

[file_index] = [table1]。[file_index] [celeb_name] = 'オードリーヘップバーン'

[table1]の[file_index]と[table2]の間には1対多の関係があります。[table1]の1つのレコードと[table2]の多対多の関係です。

どうもありがとう

17
bonzo46

これでいいですか?角かっこなどを追加します。あまりにも自分自身にアクセスしません。

INSERT INTO table2 (file_index, celeb_name)
SELECT file_index, 'Audrey Hepburn'
FROM table1
WHERE filename = 'aud'
  AND file_index NOT IN (SELECT DISTINCT file_index 
                         FROM table2 
                         WHERE celeb_name = 'Audrey Hepburn')
16
Tor Valamo

コメントで述べたように、NOT INはJet/ACEによって最適化されておらず、通常はOUTER JOINを使用する方が効率的です。この場合、結合の外側でフィルタリングする必要があるため、サブクエリが必要になります。

  INSERT INTO photos_by_celebrity ( ORIG_FILE_INDEX, celebrity_name )
  SELECT tblOriginal_Files.ORIG_FILE_INDEX, 'Audrey Hepburn'
  FROM tblOriginal_Files 
    LEFT JOIN (SELECT DISTINCT ORIG_FILE_INDEX  
                  FROM photos_by_celebrity 
                  WHERE celebrity_name = 'Audrey Hepburn') AS Photos
    ON tblOriginal_Files.ORIG_FILE_INDEX = Photos.ORIG_FILE_INDEX
  WHERE Photos.ORIG_FILE_INDEX Is Null;

(それは正確ではないかもしれません-私は手作業でSQLを書くことにひどく、特にJOIN構文を正しく取得しています)

ただし、これにより挿​​入されるレコードが多すぎるのではないかと思います(同じ予約がNOT INバージョンに適用されます)。

2
David-W-Fenton

元の質問では、テーブルとフィールドの名前を変更し、読みやすくするために角かっこを挿入しました。

以下は、MS Access形式で機能する最後のSQLステートメントです。素晴らしい結果、Torに再度感謝します!!

INSERT INTO photos_by_celebrity ( ORIG_FILE_INDEX, celebrity_name )

SELECT tblOriginal_Files.ORIG_FILE_INDEX, 'Audrey Hepburn' AS Expr1

FROM tblOriginal_Files

WHERE (((tblOriginal_Files.ORIG_FILE_INDEX) Not In (SELECT DISTINCT ORIG_FILE_INDEX 

                         FROM photos_by_celebrity  

                         WHERE celebrity_name = 'Audrey Hepburn')) AND ((tblOriginal_Files.ORIGINAL_FILE) Like "*aud*"));
0
bonzo46