背景:我一直负责运行一项工作来删除在一个时间帧之前存储的数据和在另一个时间帧之前存储的哈希数据。数据集很大,我不能依赖所有连接表中存在的链接数据,并且可以在2个字段上连接一个表。
t1 = {id, t2_id, t2_2_id, bool_one, bool_two, bool_three , a_date}
t2 = {id, 2_id, other_field}
t3 = {id, t1_id, other_field}
首先,我需要删除a_date为6个月或更早且bool_one = 1且(bool_two = 1或bool_three = 1)或(bool_one = 0且a_date早于1个月)的所有记录
接下来我需要更新a_date为3个月或更早的所有记录散列数据,并且bool_one = 1和(bool_two = 1或bool_three = 1)或(bool_one = 0且a_date早于1个月)
我想知道考虑下面的查询,如果一个或多个连接表没有链接数据会发生什么?并且如果仍然要删除/更新已连接的已连接数据并忽略任何不连接的数据。
所以例如从t1和t2删除all但t3中没有链接数据所以忽略或删除t1和t3中的所有数据,但t3中没有链接数据所以忽略或仅t1中的数据所以忽略t2和t3等等。
代码:
DELETE a, b, c, d
FROM t1 a
INNER JOIN t2 b on b.id = a.t2_id
INNER JOIN t2 c on c.id = a.t2_2_id
INNER JOIN t3 d on d.t1_id = a.id
WHERE a.bool_one = 1 AND (a.bool_two = 1 OR a.bool_three = 1)
AND a.a_date <= Now() - INTERVAL 6 MONTH
OR (a.bool_1 = 0 AND a.a_date <= Now() - INTERVAL 1 MONTH)
更新查询几乎相同,所以我不会包含它。
答案 0 :(得分:1)
考虑到您是通过 INNER JOIN 完成此操作,那么您应该期望通过表t1
,t2
和{进行端到端记录的链接{1}}要删除的行 - 它是全部或全部,与SELECT相同。
我在sqlfiddle中汇总了一个简化的INNER JOIN示例。它具有与模拟JOIN相同的基本模式,但我已经使WHERE子句只使用。t3
,因为它对于演示如何选择记录并不重要,只是有些是。
模拟数据旨在使行为易于查看。在示例中,id
具有值为1,2和3的记录,表t1
具有值为1和2的记录,而表t2
具有值为1的单行。 / p>
如果我们在WHERE子句中使用a。t3
= 3,则不会删除任何行,因为没有匹配要通过id
和t2
链接到此值。
同样,使用。t3
= 2不会删除任何行,因为仍然没有链接可以一直到id
。
a。t3
= 1是唯一可以在所有表中建立链接的值,并删除所有三个表中的单个匹配记录。
如果您使用 LEFT JOIN 而不是INNER JOIN,那么您将获得更多原谅行为,这允许删除您提到的场景中的记录,例如
LEFT JOIN sqlfiddle测试