MS Access - удаление записей с помощью промежуточного итога (вывод подзапроса) <100 - PullRequest
0 голосов
/ 11 марта 2019

Мне нужно удалить записи с общим количеством <100 и [Линия продуктов] содержит «Электроника». </p>

Ниже приведены данные таблицы, здесь RunningTotal не является исходным полем в таблице, это вывод подзапроса (внутреннего запроса).

ID    Product Line           Qty     RunningTotal
1     Electronics            15            15   
2     R.K. Electricals       20            20
3     Samsung Electronics    10            25
4     Electricals            30            50
5     Electricals            45            95
6     Electronics Components 18            43
7     Electricals            25           120
8     Electronics            50            93
9     Electricals Machines   65           185
10    Electronics            15           108
11    ABC Electronics Ltd    52           160
12    Electricals            15           200

Я использовал приведенный ниже запрос для фильтрации записей, когда [Product Line] содержит «Электроника» и итоговый итог <100. </p>

select t.*, q.runningtotal from salesdata t inner join
(
    select t.id, 
        (
            select sum(u.qty) 
            from salesdata u 
            where u.[product line] like "*Electronics*" and u.id <= t.id
        ) as runningtotal
    from salesdata t
) q on t.id = q.id
where q.runningtotal < 100 and t.[product line] like "*Electronics*"

Я скопировал сопоставленные записи (на основе вышеуказанного запроса) в другую таблицу, которая работает. После того, как я скопировал, мне нужно удалить соответствующие записи ( [Линия продуктов] содержит «Электроника» и текущий итог <100 </em>). Я написал ниже запрос, он выдает ошибку невозможно удалить из указанной таблицы и не работает

delete from (
select t.*, q.runningtotal from salesdata t inner join
(
    select t.id, 
        (
            select sum(u.qty) 
            from salesdata u 
            where u.[product line] like "*Electronics*" and u.id <= t.id
        ) as runningtotal
    from salesdata t
) q on t.id = q.id
where q.runningtotal < 100 and t.[product line] like "*Electronics*")

Ваша помощь будет очень признательна, заранее спасибо.

Ответы [ 2 ]

1 голос
/ 11 марта 2019

Вы можете попробовать:

delete from salesdata sd
    where sd2.[product line] like "*Electronics*" and
          (select sum(sd2.qty)
           from salesdata as sd2
           where sd2.[product line] like "*Electronics*" and
                 sd2.id < sd.id
          ) < 100;
0 голосов
/ 11 марта 2019

В MS Access DELETE должен указывать таблицу, а не запрос.Предполагая, что вы сохранили запрос SELECT (который у вас должен иметь для механизма для компиляции наилучшего плана выполнения), рассмотрим предложение EXISTS с подзапросом.

delete from salesdata s
where exists (select 1 from mysavedquery mq where s.id = mq.id)
...