3

だから私は周りを見回していて、あまり見つけていません。これはおそらくこれを行うのに間違った方法であるため、事前に謝罪しますが、それはそれが何であるかです。

だから私は同僚が完了したクラスを追跡する必要があります。これは、MSAccessデータベースにフィードするExcelシートを介して行われます。私に提供される3つのフィールドがあります。

フルネーム、コース名、および完了日。

ここに主キーがないことを知っているので、Excelシートから取得した一意のレコードのみを追加するクエリを作成しようとしています。単一のフィールドに基づいてそれを行うことはできますが、たとえばフルネームとコース名の両方が同じでない場合にのみ、クエリにそれを追加させるための支援が必要です

Joe Somebody, Course#1, 14feb13

Joe Somebody, Course#2, 15feb13

Joe Somebody, Course#1, 15feb13

最初の2行をテーブルに追加するクエリが必要ですが、コース#1をすでに完了しているため、3番目の行は無視します。これは私がこれまでに持っているものであり、基本的に私の名前フィールドを主キーに変えます。

INSERT INTO table [Full name], [Course], [Date]

SELECT excel_table.[Full name], excel_table.[Course], excel_table.[Date]

FROM excel_table

WHERE excel_table.[Full name] Not in (SELECT table.[Full Name] FROM table)

私はまた、最後にいくつかのIs Not Nullのものを持っていますが、それが質問に関連するとは思いませんでした。

4

2 に答える 2

2

重複を避ける最も簡単な方法は、インデックスを追加することです。この場合、複合主キーが答えのようです。複合キーに含めるすべてのフィールドを選択し、[主キー] ボタンをクリックするだけです。

複合主キーを追加

主キーを構成するどのフィールドでも null は許可されませんが、フィールドの組み合わせが一致しない限り、各フィールドのデータを繰り返すことができます。そう:

Joe Somebody, Course#1, 14feb13     <-- good
Joe Somebody, Course#2, 15feb13     <-- good
Joe Somebody, Course#1, 15feb13     <-- fails
Joe SomebodyElse, Course#1, 14feb13 <-- good

ここで、クエリ デザイン ウィンドウで通常の追加クエリ ビルドを実行すると、レコードが Excel インポート テーブルに 2 回存在するか、Access に既に存在する場合にエラーが発生します。

追加時のエラー

于 2013-02-19T11:26:25.350 に答える
0

複合主キーは実際には必要ありません。実際、Access には、複合主キーを使用しないことが推奨される場所がいくつかあります。単純な整数の主キーを使用して Access テーブルを作成できます。

create table CourseCompletions (
  ID autoincrement primary key
, FullName varchar(100)
, CourseName varchar(100)
, CompletionDate date
);

次に、Excel ファイルからすべてのデータを飲み込むことができます。

insert into CourseCompletions (
, FullName
, CourseName
, CompletionDate
) select
  [Full name]
, [Course]
, [Date]
from excel_table;

これにより、入力 Excel テーブルの各行に一意の番号が与えられ、Access テーブルに格納されます。ここで、CourseCompletions テーブルから競合する行を拒否する方法を決定する必要があります。(次のクエリは、拒否しないことを決定したレコードのみを表示します。)後日、同じコースの同じ人による完了を拒否する場合:

select
  ID
, FullName
, CourseName
, min(CompletionDate)
from CourseCompletions
group by
  ID
, FullName
, CourseName;

それより前の日付で完了を拒否する場合は、単純に MIN を MAX に変更します。

以前に Excel テーブルに表示されたコースの完了を拒否する場合:

select
  cc1.ID
, cc1.FullName
, cc1.CourseName
, cc1.CompletionDate
from CourseCompletions as cc1
inner join (
  select
    max(ID) as WantedID
  , FullName
  , CourseName
  from CourseCompletions
  group by FullName, CourseName
) as cc2
on cc1.ID = cc2.WantedID;

また、後で Excel テーブルに表示されるコースの完了を拒否するには、単純に MAX を MIN に置き換えます。

したがって、整数の主キーを使用すると、いくつかのオプションが得られます。

于 2013-02-20T05:02:26.213 に答える