Access - запрос, оператор Distinct

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Андрей гость
Новичок
Новичок
 
Сообщения: 42
Зарегистрирован: 21.09.2005 (Ср) 21:11

Access - запрос, оператор Distinct

Сообщение Андрей гость » 21.09.2005 (Ср) 21:23

Помогите начинающему. Оператор Distinct убирает дубликаты определяя их по всем полям строки, как сделать запрос чтобы убрать дубликаты, ореентируясь на определенные поля, но выводились в результате запроса все поля строки. :?:
Ученье свет, а не ученых тьма!

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 21.09.2005 (Ср) 21:48

Distinct убирает дубликаты, ориентируясь не на все поля строки, а на все поля, перечисленные в селект-листе, но не использованные в аргументах агрегатных функций. Это значит, что если ты написал:
Код: Выделить всё
select distinct Field2, Field5
from MyTable

, то на выходе ты получишь все имеющиеся у тебя комбинации полей Field2 и Field5, а на все остальные поля этой таблицы серверу накласть.

А вообще, постановка задачи выглядит как-то нелогично - тебе нужны все поля (ну так выведи их все, какая проблема). А сделать дистинкт по некоторым, значит получить на выходе скажем 1 запись из 10 - но как ты определишь, какая именно из этих 10 записей тебе нужна?

Опиши задачу в ее предметной области, а то может простейшая ошибка в формулировке - и получишь совершенно не то, чего хотел.

Андрей гость
Новичок
Новичок
 
Сообщения: 42
Зарегистрирован: 21.09.2005 (Ср) 21:11

Сообщение Андрей гость » 22.09.2005 (Чт) 12:06

Смысл таков: Таблица - T1, поля A, B, C, D, поле D - дата
В таблице встречаются строки где поле A, B, C, одинаковы, а в поле D дата внесения записи
Вывести надо все поля, убрав дубликаты по A, B, C, а по полю D вывести по последне дате внесения.
поля, перечисленные в селект-листе должны быть все, а предикт Distinct относилсябы только к полю A, B, C.
Кажется вот так, помоги пожалуйста.
Ученье свет, а не ученых тьма!

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 22.09.2005 (Чт) 13:24

Код: Выделить всё
SELECT A, B, C, Max(D)
FROM MyTable
Group By A, B, C

Андрей гость
Новичок
Новичок
 
Сообщения: 42
Зарегистрирован: 21.09.2005 (Ср) 21:11

Сообщение Андрей гость » 22.09.2005 (Чт) 15:49

Извиняюсь skiperski, то что Вы мне написали работает, большое Вам за это спасибо, но я забыл по пятое поле Е - текстовое, в котором хранится различная информация. Если добавить в этот запрос поле Е, то по полю A, B, C дубли не убираются така как поле Е не может быть одинаковым.
Смысл остается прежним "кто (поля A, B, C) когда (поле D) и какую запись сделал (поле Е), только поля A, B, C не должны дублироваться"
Ученье свет, а не ученых тьма!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 22.09.2005 (Чт) 15:55

В этом случае задача теряет смысл.
Если два разных A слить в одно, то как ты определишь, к какому именно A относится каждый конкретный E?
Lasciate ogni speranza, voi ch'entrate.

Андрей гость
Новичок
Новичок
 
Сообщения: 42
Зарегистрирован: 21.09.2005 (Ср) 21:11

Сообщение Андрей гость » 22.09.2005 (Чт) 16:02

Примерно так:
Есть база данных студентов. В полях A, B, C фамилия, имя, отчество соответственно. В поле D дата сдачи зачета, а в поле Е сдал или не сдал с коментариями. Один и тот же студент может сдавать зачет раз 20. Надо создать запрос чтобы студент был записан один раз, но на последнюю дату, соответственно чтобы было видно сдал он или не сдал зачет и коментарии.
Как это решить я не знаю, подскажите
Ученье свет, а не ученых тьма!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 22.09.2005 (Чт) 16:08

Делай в два запроса; во втором связывай по дате (D = MAX(D))
Lasciate ogni speranza, voi ch'entrate.

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 22.09.2005 (Чт) 16:10

Код: Выделить всё
SELECT t1.A, t1.B, t1.C, t1.D, t1.E
FROM MyTable t1
    INNER JOIN (
        SELECT A, B, C, Max(D) AS LastDate
        FROM MyTable
        GROUP BY A, B, C
    ) t2
    ON (t1.A = t2.A AND t1.B = t2.B AND t1.C = t2.C AND t1.D = t2.LastDate)

Вроде бы так.

ЗЫ: Теперь скобки ставлю везде :)

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Сообщение lord0n » 22.09.2005 (Чт) 16:35

skiperski писал(а):
Код: Выделить всё
SELECT t1.A, t1.B, t1.C, t1.D, t1.E
FROM MyTable t1
    INNER JOIN (
        SELECT A, B, C, Max(D) AS LastDate
        FROM MyTable
        GROUP BY A, B, C
    ) t2
    ON (t1.A = t2.A AND t1.B = t2.B AND t1.C = t2.C AND t1.D = t2.LastDate)

Вроде бы так.

ЗЫ: Теперь скобки ставлю везде :)


ребят, вы запросы создаете какой то прогой или ручками?
Теория - это когда что-то не работает и известно почему.
Практика - это когда что-то работает, но неизвестно почему.
Нам удалось совместить теорию с практикой, теперь ничего не работает и неизвестно почему.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 22.09.2005 (Чт) 16:36

Головой :)
Lasciate ogni speranza, voi ch'entrate.

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Сообщение lord0n » 22.09.2005 (Чт) 16:40

alibek писал(а):Головой :)


я серьезно, если есть прога - плиз, скажите названия
а то я все из головы беру :lol:
Теория - это когда что-то не работает и известно почему.
Практика - это когда что-то работает, но неизвестно почему.
Нам удалось совместить теорию с практикой, теперь ничего не работает и неизвестно почему.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 22.09.2005 (Чт) 16:44

Я, например, делаю в MS SQL Manager. До этого писал в TOAD. Еще раньше писал в Блокноте.
Lasciate ogni speranza, voi ch'entrate.

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 22.09.2005 (Чт) 17:36

lord0n писал(а):ребят, вы запросы создаете какой то прогой или ручками?

Ручками и только ими.

Андрей гость
Новичок
Новичок
 
Сообщения: 42
Зарегистрирован: 21.09.2005 (Ср) 21:11

Сообщение Андрей гость » 22.09.2005 (Чт) 18:49

Я еще не пробовал работает или нет, но ход мыслей ясен.
Скажу честно ребята вы монстры (в хорошем смысле этого слова), ведь чтобы решить данную задачу не надо быть профи в SQL, надо быть просто хорошим математиком.
Восхищаюсь :?
Ученье свет, а не ученых тьма!


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList