选择对在同一个表中的SQL记录

问题描述 投票:0回答:1

我有购买记录的Access表称为记录。

   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 =真

   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     |
------------------------------------------------------

到目前为止,我有这个,但它真正的设置所有的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')
sql vba ms-access
1个回答
1
投票

随着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最后一个条件包括在列PriceDateType重复的情况。 结果:

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
© www.soinside.com 2019 - 2024. All rights reserved.