2011-01-12 291 views
3

ここは私の状況です。 まず第一に、私はリレーショナルデータベースに取り組んでいません。データを操作する簡単な方法として単にアクセスを使用しています。 現時点では、テーブルがたくさんあります。
1つのメインテーブルMAINと約10個の他のテーブルを呼び出すことができます.X1、X2、X3などを呼び出すことができます。 X1テーブルにはX1プロパティを持つアイテムが含まれています。 X2テーブルには、X2プロパティを持つ項目などがあります。ACCESS/SQL:同時にINSERT/UPDATEを挿入する方法は?

すべてのXxテーブルには同じフィールドがあります。 MAINテーブルにも同じフィールドがあり、さらにブール型のフィールドX1、X2などがあります。私が何をしたいか

私はXXテーブルからデータをメインテーブルを供給します。
なので、複数のプロパティを持つアイテムがある可能性があります。そのため、たとえばX1、X2、X5に表示されます。

だから私は、最初にこれを実行している時に試してみました:

UPDATE MAIN 
SET itemnumber = X1.itemnumber, x1 = "true"; 

が、それは何かを与えるものではありません。 MAINテーブルにはまだレコードが存在しないので、これは論理的であると思います。


テーブルX1のレコードがMAINにまだ存在しない場合は、追加してX1フィールドをtrueに設定します。
X1のレコードがすでにMAINに存在する場合は、それを更新してX1フィールドをtrueに設定します。

(その後、私は私が持っているすべてのXテーブル上で実行するためにそれを更新します。)

私はINSERT INTOを検討しているが、私はすでに存在するデータを上書きするか、エラーを生成したくない(私は本当にこのすべてについて多くを知りません> _>)

アドバイスを提供できる方は、事前にお礼を申し上げます。

:私は、私が最初にこれを試してみました

(彼らは同じ構造を持っている)私が最初にメインテーブルにXXテーブルからすべてのデータを挿入しようと思った

編集1
私はその後、私は、Feを実行し、私はXテーブルからすべてのデータを追加したら考え出し/

INSERT INTO MAIN.itemnumber 
(select X1.itemnumber from X1 
UNION ALL 
select X2.itemnumber from X2) 

は、それが動作するかどうかを確認するだけで一つのフィールドでそれを試してみましたが、そうでありませんw XxテーブルごとにWHERE EXISTSでUPDATEを行い、それに応じてXxプロパティをtrueに設定すると完了です。

しかし、私は一つでも....

答えて

1

は、私はその間に使用される代替ソリューションです:

INSERT INTO MAIN 
SELECT X1.itemnumber AS itemnumber 
FROM X1 
WHERE not exists (select itemnumber 
from MAIN 
where MAIN.itemnumber = X1.itemnumber); 

は、それぞれの繰り返しXxテーブル。重複を処理します。その後、

、プロパティを追加するには:

UPDATE MAIN SET X1 = true 
WHERE exists (select * 
from X1 
where X1.itemnumber = MAIN.itemnumber); 

は各XXテーブルに対して繰り返します。

propably

ない最も効率的な方法は、
を(... 24回、実際にクエリを編集する必要がありました)ちょっと、それは働いていた...

を今、誰かが一発でこれを行う方法を持っている場合...

-3
if EXISTS(*SELECT STATEMENT*) 
Begin 
    //Update 
end 
ELSE 
BEGIN 
    //Insert 
END 
+0

私はSQLでIFを使うことができませんでした。これから何かをしようとします! –

+1

"IF"はAccess ... "無効なSQL命令"で動作しません。あるいは、私はそれを正しくやっていないかもしれません。 –

+1

質問として明確に記入された(質問の文章で特定されている)質問に対する非Access SQLをAccessとして投稿しないでください。 -1 –

1

まず第一に、あなたあるでの作業にいくつかのテーブルからデータをマージとして「シンプル」として何かをすることに苦労していますたとえそれがひどく設計されていたとしても、

第2に、同じステートメントでSQLを挿入と更新の両方に使用することはできません。そのための特別な句はSQL Server 2008で導入されましたが、標準SQLとAccessバリアントの一部ではありません。

第三に、あなたはほとんど右あなたの編集1であなたのINSERTの文ではなく、かなりです。代わりにこれを試してみてください:コードで

INSERT INTO MAIN (
    field1, 
    field2, 
    x1, 
    x2, 
    ...) 
SELECT 
    field1, 
    field2, 
    True, 
    False, 
    ... 
FROM X1 
UNION ALL 
SELECT 
    field1, 
    field2, 
    False, 
    True, 
    ... 
FROM X2 
... 

を、field1field2は、x2、& C すべてのテーブルに共通している「同じフィールド」のすべてのスタンドイン、およびx1のリストですMAINのすべてのxXフィールドが含まれるまで続ける必要があります。次に、UNIONに参加する各SELECTには、MAYのフィールド数と同じ位置にあるFalseがあります。位置はTrueで占められています(NB:実際のブール型の場合は引用符なし - xXフィールドの場合、アクセスでNullにすることはできません)。

これは私が正しくあなたの悪い説明したスキーマを理解したので、もちろん、前提として....ここ

+0

この回答は、重複の作成を避けるための部分を除外しているようです。 –

+0

申し訳ありませんが、説明が簡潔であれば、私はそれをより良い方法で配置する方法を知りませんでした。また、私はネイティブスピーカーではないので、奇妙な配合を使ったかもしれません!それでも、あなたはそれが正しいと思われる:) 1つの質問:私はこのクエリに問題があると私には思われる:アイテムは異なるテーブルに表示することができます(複数のプロパティを持つことができます);あなたの例では項目はX1及びX2であれば、「X2 FROM フィールド1、フィールド2 、 FALSE、TRUE 、 ... を選択」ではないだろう、それはあっても、falseにX1プロパティを置きますtrueに設定されていますか? –

+0

@ David-W-Fenton - あなたの権利、私はそれを書いたようにそれについて忘れました。 – RolandTumble

関連する問題