Выберите пару записей в одной таблице SQL - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть таблица Access, которая называется RECORDS с записями покупок.

   Id   | Type |  Price  |     Date    |  Processed  |
------------------------------------------------------
   1    |  C   |   30€   |  01/01/2016 |    Null     |
------------------------------------------------------
   2    |  R   |  -30€   |  01/01/2016 |    Null     |
------------------------------------------------------
   3    |  C   |   10€   |  02/02/2016 |    Null     |
------------------------------------------------------
   4    |  C   |   10€   |  02/02/2016 |    Null     |
------------------------------------------------------
   5    |  R   |  -10€   |  02/02/2016 |    Null     |
------------------------------------------------------
   6    |  C   |   25€   |  03/02/2016 |    Null     |
------------------------------------------------------
   7    |  C   |   42€   |  04/02/2016 |    Null     |
------------------------------------------------------

Что я хочу сделать, так это установить True для записей о начислении (Тип 'C'), у которых есть противоположная пара записей о возмещении (Тип 'R').

Примерно так: 1C и 1R = True

   Id   | Type |  Price  |     Date    |  Processed  |
------------------------------------------------------
   1    |  C   |   30€   |  01/01/2016 |    True     |
------------------------------------------------------
   2    |  R   |  -30€   |  01/01/2016 |    True     |
------------------------------------------------------
   3    |  C   |   10€   |  02/02/2016 |    True     |
------------------------------------------------------
   4    |  C   |   10€   |  02/02/2016 |    Null     |
------------------------------------------------------
   5    |  R   |  -10€   |  02/02/2016 |    True     |
-----------------------------------------------------
   6    |  C   |   25€   |  03/02/2016 |    Null     |
------------------------------------------------------
   7    |  C   |   42€   |  04/02/2016 |    Null     |
------------------------------------------------------

Пока что у меня есть это, но оно устанавливает True для всех записей N '' C '

UPDATE 
RECORDS AS T1 
INNER JOIN RECORDS T2 
ON ABS(T1.Price) = ABS(T2.Price) AND T1.Date =T2.Date 
SET T1.Processed = TRUE
WHERE (T1.Type = 'C' AND T2.Type = 'R') OR (T1.Type = 'R' AND T2.Type = 'C')

1 Ответ

0 голосов
/ 07 февраля 2019

С EXISTS:

UPDATE RECORDS AS T 
SET T.Processed = TRUE
WHERE 
  (T.Type IN ('C', 'R') AND
    EXISTS (SELECT 1 FROM RECORDS 
      WHERE Type IN ('C', 'R') AND Type <> T.Type AND Date = T.Date AND Price + T.Price = 0
    )
  )
  AND T.Id = (SELECT MIN(ID) FROM RECORDS WHERE Date = T.Date AND Price = T.Price AND Type = T.Type)

Последнее условие в WHERE охватывает случай дубликатов в столбцах Price, Date и Type.Результаты:

Id  Type    Price   Date        Processed
1   C       30,00   1/1/2016    True
2   R       -30,00  1/1/2016    True
3   C       10,00   2/2/2016    True
4   C       10,00   2/2/2016    NULL
5   R       -10,00  2/2/2016    True
6   C       25,00   3/2/2016    NULL
7   C       42,00   4/2/2016    NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...