テーブルが2つあります。タスクとカテゴリ。
重複する値があるため、TaskIDは主キーではありません。特定のタスクに対して複数の連絡先が選択されている場合、taskidとその他の詳細が重複します。クエリを記述しました。
SELECT Priority, Subject, Status, DueDate, Completed, Category
FROM Task, Categories
WHERE Categories.CategoryID=Task.CategoryID;
これで、そのタスクに対して複数の連絡先が選択されたため、taskid = T4には2つのレコードがあります(灰色で強調表示されています)。 MS Access 2003でdistinctを使用してみましたが、機能しません。個別のレコードを表示したい。 (ここではtaskidを表示する必要はありません)私が書く場合:
select priority, distinct(subject), .......
上記のクエリで述べたのと同じで、エラーが発生します。私も別の行を試しましたが、成功しませんでした。 msアクセスで個別の値を取得するにはどうすればよいですか?
はい、このように機能しています。
SELECT DISTINCT Task.Priority, Task.Subject, Task.Status, Task.DueDate,
Task.Completed, Categories.Category
FROM Task, Categories
WHERE (((Categories.CategoryID)=[Task].[CategoryID]));
SELECT DISTINCTを使用したくないので、コードのコンパイルに時間がかかることがわかりました。もう1つの方法は、GROUP BYを使用することです。
SELECT Priority, Subject, Status, DueDate, Completed, Category
FROM Task, Categories
WHERE Categories.CategoryID=Task.CategoryID
GROUP BY Subject;
現時点ではVBAを起動していませんが、これでも動作するはずです。
SELECT DISTINCTを使用するとうまくいきますが、ここでのより良い解決策はデータベース設計を変更することです。
レコードが重複すると、データの不整合が生じる可能性があります。たとえば、同じタスクIDを持つ異なるレコードに2つの異なるステータスがあると想像してください。どちらが正しいでしょうか?
より良い設計には、次のように、タスクテーブル、連絡先テーブル、割り当てテーブルなどが含まれます(角かっこ内のフィールドはPKです)。
タスク:[TaskID]、TaskPriority、Subject、Status、DueDate、Completed、StartDate、Owner、CategoryID、ContactID、...
連絡先:[ID]、名前、姓、住所、電話番号、...
割り当て:[TaskID、ContactID]
次に、タスクテーブルから単純なSELECTを使用してタスクを取得できます。また、タスクに割り当てられた連絡先を知る必要があるときはいつでも、次のようにJOIN句を使用します。
SELECT T.*, C.*
FROM TaskID as T
INNER JOIN Assignment as A
ON T.TaskID = A.TaskID
INNER JOIN Contac as C
ON A.ContactID = C.ID
または類似。 SQLのすべてのクエリ機能を使用して、結果をフィルタリング、並べ替え、またはグループ化できます。