web-dev-qa-db-ja.com

msアクセスでdistinctを使用する方法

テーブルが2つあります。タスクとカテゴリ。

Task Table

Categories Table

重複する値があるため、TaskIDは主キーではありません。特定のタスクに対して複数の連絡先が選択されている場合、taskidとその他の詳細が重複します。クエリを記述しました。

SELECT Priority, Subject, Status, DueDate, Completed, Category
FROM Task, Categories
WHERE Categories.CategoryID=Task.CategoryID;

Query Result

これで、そのタスクに対して複数の連絡先が選択されたため、taskid = T4には2つのレコードがあります(灰色で強調表示されています)。 MS Access 2003でdistinctを使用してみましたが、機能しません。個別のレコードを表示したい。 (ここではtaskidを表示する必要はありません)私が書く場合:

select priority, distinct(subject), .......

上記のクエリで述べたのと同じで、エラーが発生します。私も別の行を試しましたが、成功しませんでした。 msアクセスで個別の値を取得するにはどうすればよいですか?

7
bsm

はい、このように機能しています。

SELECT DISTINCT Task.Priority, Task.Subject, Task.Status, Task.DueDate, 
Task.Completed, Categories.Category
FROM Task, Categories
WHERE (((Categories.CategoryID)=[Task].[CategoryID]));
8
bsm

SELECT DISTINCTを使用したくないので、コードのコンパイルに時間がかかることがわかりました。もう1つの方法は、GROUP BYを使用することです。

    SELECT Priority, Subject, Status, DueDate, Completed, Category
    FROM Task, Categories
    WHERE Categories.CategoryID=Task.CategoryID
    GROUP BY Subject;

現時点ではVBAを起動していませんが、これでも動作するはずです。

5
Tylor Hess

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のすべてのクエリ機能を使用して、結果をフィルタリング、並べ替え、またはグループ化できます。

2
Clon