繁体   English   中英

从另一个表更新具有多个条件的表

[英]Updating a table with mutliple criteria from another table

我继承了一个数据库,其中包含两个相关的表,一个用于客户,一个用于事务。 客户可能有多个事务,这两个表通过“客户ID”字段链接。

作为取消标识过程的一部分,在关闭文件七年后,我们需要在“客户”表中删除客户的名字,姓氏和出生日期,但是我们希望保留该记录,因此我们能够跟踪我们过去所做的工作。

我想创建一个更新查询,当客户端满足以下条件时,它将用取消标识的数据替换标识数据:

  • 客户端没有当前打开的事务(即,在Matters表的文件关闭日期字段中为“ null”)。
  • 客户没有不到七年前就关闭的事务。
  • 客户有一项或多项已于七年前关闭的事务。

但是,我无法弄清楚如何使它工作。 设置一个更新查询可以更新Clients表中的信息(如果它具有的相关事项早于七年)似乎是可行的,但是我无法弄清楚如何以不会更新的方式进行操作如果客户仍有未解决的问题或未满7年的问题,则提供此信息。 有人能指出我正确的方向吗?

为了进一步扩展,到目前为止,我的查询涉及两个表ClientsMatters 文件关闭日期在Matters ,客户的标识详细信息在“ Clients 据我了解,与其说是标准问题,不如说是联接问题。

Client | MatterID | MatterClosureDate
-------|----------|------------------
Alice  | 1        | 2008
Bruce  | 2        | 2009
Carrol | 3        | 2009
Bruce  | 250      | 2012

为了说明这一点,两个表有四个相关结果。 爱丽丝(Alice)和卡罗尔(Carrol)都是没有事务的客户,这些事务仍未解决或最近未解决,但是布鲁斯(Bruce)有一件事应取消他的资格。 目前,虽然我的查询还不够复杂,无法实现,但返回了:

Client | MatterID | MatterClosureDate
-------|----------|------------------
Alice  | 1        | 2008
Bruce  | 2        | 2009
Carrol | 3        | 2009

您可以在文件关闭日期字段的条件中输入< #9/14/2009# And Is Not Null

考虑为每个列出的条件使用与每个ClientID逐行匹配的相关子查询:

SELECT c.FirstName, m.MatterID, m.MatterClosureDate
FROM Clients c
INNER JOIN Matters m ON c.ID = m.ClientID

WHERE 
   (SELECT Count(*) FROM Matters sub 
    WHERE sub.ClientID = c.ID
    AND sub.MatterClosureDate IS NULL) = 0
AND
   (SELECT Count(*) FROM Matters sub 
    WHERE sub.ClientID = c.ID
    AND sub.MatterClosureDate > Year(Date()) - 7) = 0
AND
  (SELECT Count(*) FROM Matters sub 
   WHERE sub.ClientID = c.ID
   AND sub.MatterClosureDate <= Year(Date()) - 7) > 0;

-- FirstName    MatterID    MatterClosureDate
-- Alice        1           2008
-- Carrol       3           2009

对于更新查询,将上面的SELECT转换为UPDATE语句:

UPDATE Clients c
SET c.FirstName = 'XXXXX', 
    c.LastName = 'XXXXX',
    c.DOB = NULL 

WHERE 
  (SELECT Count(*) FROM Matters sub 
   WHERE sub.ClientID = c.ID
   AND sub.MatterClosureDate IS NULL) = 0
AND
  (SELECT Count(*) FROM Matters sub 
   WHERE sub.ClientID = c.ID
   AND sub.MatterClosureDate > Year(Date()) - 7) = 0
AND
  (SELECT Count(*) FROM Matters sub 
   WHERE sub.ClientID = c.ID
   AND sub.MatterClosureDate <= Year(Date()) - 7) > 0;

另外,您可以使用Access的域聚合DCount()

UPDATE Clients c    
SET c.FirstName = 'XXXXX', 
       c.LastName = 'XXXXX',
       c.DOB = NULL 

WHERE     
    DCount("*", "Matters", "ClientID = " & c.ID & " 
           AND MatterClosureDate IS NULL") = 0
AND
    DCount("*", "Matters", "ClientID = " & c.ID & " 
           AND MatterClosureDate  > Year(Date()) - 7") = 0
AND
    DCount("*", "Matters", "ClientID = " & c.ID & " 
           AND MatterClosureDate  <= Year(Date()) - 7") > 0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM