Удаление дубликатов в SQL в Access - PullRequest
1 голос
/ 11 января 2012

У меня есть таблица, которая состоит из столбцов id (ключ), символа, направления, диапазона, цены, процента. Я хотел бы удалить данные, где символ, направление, цена и процент совпадают с самым низким диапазоном. Как мне это сделать?

Я пытался изменить это утверждение: DELETE FROM aw WHERE id not in (select min(id) from aw group by symbol, direction, price, percent);, чтобы заставить что-то работать.

Ответы [ 2 ]

2 голосов
/ 11 января 2012

Вот пример данных для таблицы aw . Основываясь на вашем описании, я думаю, что вы хотите отбросить строки с ID значениями 2, 3 и 5.

ID symbol direction range price percent
1  a      x            15    10       5
2  a      x            20    10       5
3  b      y            40    50       5
4  b      y            10    50       5
5  a      x            15    10       5

Определение минимального значения диапазона для каждой комбинации symbol, direction, price и percent.

qryMinRanges

SELECT
    aw.symbol,
    aw.direction,
    aw.price,
    aw.[percent],
    Min(aw.range) AS MinOfrange
FROM aw
GROUP BY
    aw.symbol,
    aw.direction,
    aw.price,
    aw.[percent];

... который дает этот набор результатов:

symbol direction price percent MinOfrange
a      x            10       5         15
b      y            50       5         10

Определите минимум ID для каждого из этих минимальных диапазонов.

qryMinID_forMinRanges

SELECT
    q.symbol,
    q.direction,
    q.price,
    q.[percent],
    q.MinOfrange,
    Min(aw.ID) AS MinOfID
FROM
    qryMinRanges AS q
    INNER JOIN aw
    ON
        (q.MinOfrange = aw.range)
        AND (q.[percent] = aw.[percent])
        AND (q.price = aw.price)
        AND (q.direction = aw.direction)
        AND (q.symbol = aw.symbol)
GROUP BY
    q.symbol,
    q.direction,
    q.price,
    q.[percent],
    q.MinOfrange;

... который дает этот набор результатов:

symbol direction price percent MinOfrange MinOfID
a      x            10       5         15       1
b      y            50       5         10       4

Так qryMinID_forMinRanges должно представлять строки, которые вы хотите сохранить. В конечном итоге вы удалите строки из aw , значения идентификаторов которых не включены в qryMinID_forMinRanges . Но сначала попробуйте этот запрос SELECT, чтобы убедиться, что вы указали правильные записи для удаления.

SELECT
    aw.ID,
    aw.symbol,
    aw.direction,
    aw.range,
    aw.price,
    aw.[percent]
FROM aw
WHERE aw.ID Not In
    (SELECT MinOfID FROM qryMinID_forMinRanges);

... который дает мне этот набор результатов:

ID symbol direction range price percent
 2 a      x            20    10       5
 3 b      y            40    50       5
 5 a      x            15    10       5

Итак, если это выглядит правильно, измените его на запрос УДАЛИТЬ.

DELETE *
FROM aw
WHERE
    (((aw.ID) Not In
        (SELECT MinOfID FROM qryMinID_forMinRanges)));

ДБ не требует * после УДАЛЕНИЯ. Но если вы хотите использовать предварительный просмотр конструктора запросов, вам необходимо указать для него поле спецификации.

Пожалуйста, примите меры предосторожности для защиты ваших данных на случай, если я напортачу здесь какие-либо подробности Резервные копии хороши. : -)

2 голосов
/ 11 января 2012

Попробуйте использовать предложение exists:

DELETE FROM aw 
WHERE 
    exists (
        select
            1
        from
            (select symbol, direction, price, percent, min(range) as minrange from aw
            group by symbol, direction, price, percent) aw2
        where
            aw2.symbol = aw.symbol
            and aw2.direction = aw.direction
            and aw2.price = aw.price
            and aw2.percent = aw.percent
            and aw2.minrange = aw.range
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...