SQL-Server2010を使用しています。
レコードを追加する際にキー項目が存在する場合は追加しないようなSQL文を作成しました。
追加するテーブルにレコードが1件以上あれば思ったとおりの処理となりますが、
1件も存在しない場合は追加できません。
下記がそのSQL文です。
原因と対策方法を教えて頂けませんでしょうか?
INSERT INTO foo(商品コード, 商品名)
SELECT DISTINCT 'ABC123' , 'りんご' FROM foo WHERE
NOT EXISTS(
SELECT * FROM foo WHERE 商品コード = 'ABC123' )
以上です。
宜しくお願い致します。
No.2ベストアンサー
- 回答日時:
「SELECT 'ABC123' , 'りんご' FROM foo」と書くとfooのレコード数だけの行の('ABC123' , 'りんご')というデータを作成してしまいます。
質問の記述ではDISTINCTを用いてそれを再度一行にまとめようとしています。しかし、fooにそもそも一行もデータがないとまとめる段階でデータが存在しないので挿入できないのです。
また、fooのレコード数だけのレコードを作ってまとめるのは無駄な作業で、fooのレコード数が増加していくとパフォーマンスの劣化が見逃せなくなります。
SQLを記述する時は、「とりあえず、動けばいい」ではなく、どんな動作が裏で行われているかを念頭に置いておくようにしてください。
で、ACCESSですが、ACCESSの場合はFROM句を省略出来ません。
その代わりに何でもいいので一行のレコード(しかも一行のみ)のダミーテーブルを作成し、FROM句を構成すればいいのです。(OracleのDUAL表と一緒です)
フィールドも一つでバイト型で構いません。とりあえず「0」の値を入力しておけば結構です。テーブル名も「DUAL」とでもつけてください。
そうすれば
INSERT INTO foo(商品コード, 商品名)
SELECT DISTINCT 'ABC123' , 'りんご' FROM DUAL
WHERE NOT EXISTS(
SELECT * FROM foo WHERE 商品コード = 'ABC123' )
でいけるはずです。
分かりやすい説明ありがとうございます。大変良く理解できました!
ACCESSでDUALテーブルを作成し1レコードだけ作成した結果、実現できました!
今日半日以上この件で試行錯誤し悩んでおりましたので感激です。
有難う御座いました。
No.1
- 回答日時:
「SELECT DISTINCT 'ABC123' , 'りんご' FROM foo」の「FROM foo」が悪さしてます。
これを付加した意図はなんでしょう?
INSERT INTO foo(商品コード, 商品名)
SELECT 'ABC123' , 'りんご'
WHERE NOT EXISTS(
SELECT * FROM foo WHERE 商品コード = 'ABC123' )
ではダメですか?
この回答への補足
回答ありがとうございます。
早速SQL-Serverで試してみたところ思ったとおりの動きになりました。
SELECT句とFROM句はセットで使用するものと思っていたのが間違いでした。
再度質問になるのですが、
同じことをAccess2003でも実現したいのですが、Access2003では「構文エラー」と
なってしまいます。
どのような解決方法がありますでしょうか?
宜しくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- PostgreSQL PostgreSQL レコードからアイテム種類数を取得したい 2 2022/11/23 22:31
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- MySQL 下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 日本の全市区町村を人口密度が低 1 2023/06/18 19:51
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- MySQL うまくいきません教えてくださいお願いしますSQLです。クエリ構文です。 1 2023/07/07 12:39
- PHP PHP MySql ページング 2 2022/09/20 06:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
3つ以上のテーブルをUNIONする...
-
Access 削除クエリが重い
-
データの二重表示の原因
-
Accessにインポートしたら並び...
-
Access VBA Me.Requery レコー...
-
非連結サブフォームのレコード...
-
MySQLでTIMESTAMP型の列から現...
-
数百万件レコードのdelete
-
Access 1レコードずつcsvで出力...
-
世代管理をするデータベース設...
-
Accessでの排他制御
-
ManagementStudioからのデータ削除
-
Accessでレコードが更新された...
-
2つの項目が重複するレコード...
-
Accessでの禁止文字チェック
-
パススルークエリの使い方
-
OUTER JOIN と TOP10との組み合...
-
SQLデータ修正時に『このレコー...
-
ファイルメーカーで週間予定表
-
レコードロックする方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessにインポートしたら並び...
-
3つ以上のテーブルをUNIONする...
-
データの二重表示の原因
-
数百万件レコードのdelete
-
Access VBA Me.Requery レコー...
-
2つの項目が重複するレコード...
-
Access 1レコードずつcsvで出力...
-
ACCESSのBookmarkプロパティの...
-
SQLの複数のカウントについて
-
ManagementStudioからのデータ削除
-
SQLServerで同一条件レコードの...
-
Accessでの禁止文字チェック
-
Access 削除クエリが重い
-
Accessでレコードが更新された...
-
非連結サブフォームのレコード...
-
Accessでの排他制御
-
Access カレントレコードがあり...
-
Accessの重複クエリで最小以外...
-
(ACCESS)並び替えをしないで...
-
テーブルのレコード削除ができ...
おすすめ情報