2

それで、MS Access の問題を抱えてまた戻ってきました。データが既に存在するかどうかを確認するサブクエリを含む INSERT INTO クエリがあります。

SELECT name, course
FROM foo    
WHERE (name, course) NOT IN (SELECT name, course FROM bar);

上記が機能しないため、私が達成しようとしていることについて少し説明します。

テーブル バーにまだ存在しない複合キーを選択しようとしています。たとえば、次の内容をテーブル バーに格納できます。

"John Doe" , "Calc 101" 
"John Doe" , "English"
"Jane Doe" , "Calc 101"

そして、以下はテーブル foo にある可能性があります:

"John Doe", "Calc 101"
"John Doe", "Science"

クエリは次を返す必要があります。

"John Doe", "Science"

私が見たどこでも、上記が機能すると言い、理論的には機能すると確信しています。私が遭遇する問題はMS Accessにあります...このクエリを実行しようとすると、サブクエリが複数のフィールドを返すことを示すポップアップが表示されます。確かに、それは私がやりたいことであるため、他の2つのフィールドを比較できる2つのフィールドを返す必要があります。上記の 2 つのフィールドは、私の "bar" データベースの複合キーです。

背景の詳細​​については、MS Excel 2007 と MS Access 2007 を使用しています。Excel を使用してデータを入力し、VB スクリプトを介してクエリを実行しています。MS Access を開いて主キーの追加に関するエラー メッセージを吐き出し、クエリを実行せずに閉じるというエラーが発生したため、最終データベースに既にあるフィールドをチェックするサブクエリを作成しようとしています。<-- 複合キーのため、これは予想されることです。

4

3 に答える 3

1

値を使用LEFT JOINして探しNULLます。

SELECT bar.name, bar.course
FROM bar LEFT JOIN foo ON bar.name = foo.name AND bar.course = foo.course
WHERE foo.name IS NULL

SQLFiddleを更新して、ファイナルテーブルを表示するためのINSERT後に続くを含めました。SELECTまた、両方のテーブルに複合主キーを追加したので、重複する挿入がないことがわかります。

于 2013-03-08T21:52:05.940 に答える
0

サブクエリは 2 つの列を返します。1を返すようにします。2 つの列に配置できる where 句が必要な場合は、OR を使用します

SELECT name, course
FROM foo    
WHERE (name) NOT IN (SELECT name FROM bar) and (course) 
NOT IN (SELECT course FROM bar);

編集:

あなたの問題は、正規化の問題に起因しています。提案された再設計は、学生用のテーブルとコース用のテーブル、およびそれらに参加するためのテーブルを持つことです. 例:

**StudentTable**
studentId(int PK)
firtName(string)
lastName(string)

**ClassTable**
classId(int PK)
ClassName
ClassDesc

**classTable_studentTable**
studentClassID
studentID
classID

各学生は多くのクラスを持つことができ、各クラスは多くの学生を持つことができます。結合テーブルを使用して正規化されるのは、多対多の関係です。

さて、質問のようなクエリを実行したい場合:

Select *.student, *.class
from
studentTable as student,
classTable as class
where
student.name<>'allen' and class.name<>'math' 
于 2013-03-08T21:22:00.967 に答える