自引用时删除数据table
Delete data when self-referencing table
我 运行 在尝试清理 MySQL table 中的数据时遇到了问题。问题是我们需要在子查询中使用table来识别需要删除的内容。
DELETE
FROM dates
WHERE event_ref IN (*list of event_refs*)
AND person_ref IN (
SELECT person.person_ref
FROM person
JOIN dates ON dates.person_ref = person.person_ref AND dates.event_ref = 14
WHERE dates.date < CURDATE()
)
Subquery
给出所有日期早于今天的人。事件引用列表是我们要删除的事件列表,排除 event_ref = 14
将查询视为 SELECT returns 我们想要删除的所有内容,但是 MySQL 在尝试使用删除时抱怨。
由于清理是一次性事件,因此我真的不想费尽心思创建一个视图来引用上述查询
您可以使用子查询:
DELETE
FROM dates
WHERE event_ref IN (*list of event_refs*)
AND person_ref IN (SELECT person_ref FROM (
SELECT person.person_ref
FROM person
JOIN dates ON dates.person_ref = person.person_ref AND dates.event_ref = 14
WHERE dates.date < CURDATE()) sub
)
您可以对相同的子查询使用内部联接 table
DELETE dates FROM dates
INNER JOIN (
SELECT person.person_ref
FROM person
JOIN dates ON dates.person_ref = person.person_ref AND dates.event_ref = 14
WHERE dates.date < CURDATE()) sub
) t on t.person_ref = dates. person_ref
AND event_ref IN (*list of event_refs*)
首先让我们缩短查询。你可以在这里去掉 person
table;你没有用它做什么。
DELETE
FROM dates
WHERE event_ref IN (*list of event_refs*)
AND person_ref IN
(
SELECT person_ref
FROM dates
WHERE event_ref = 14 AND date < CURDATE()
);
现在 MySQL 不喜欢直接访问要从中删除的 table。在 MySQL 中,您必须将 table 包装在一个伪子查询中:
DELETE
FROM dates
WHERE event_ref IN (*list of event_refs*)
AND person_ref IN
(
SELECT person_ref
FROM (SELECT * FROM dates) d
WHERE event_ref = 14 AND date < CURDATE()
);
我 运行 在尝试清理 MySQL table 中的数据时遇到了问题。问题是我们需要在子查询中使用table来识别需要删除的内容。
DELETE
FROM dates
WHERE event_ref IN (*list of event_refs*)
AND person_ref IN (
SELECT person.person_ref
FROM person
JOIN dates ON dates.person_ref = person.person_ref AND dates.event_ref = 14
WHERE dates.date < CURDATE()
)
Subquery
给出所有日期早于今天的人。事件引用列表是我们要删除的事件列表,排除 event_ref = 14
将查询视为 SELECT returns 我们想要删除的所有内容,但是 MySQL 在尝试使用删除时抱怨。
由于清理是一次性事件,因此我真的不想费尽心思创建一个视图来引用上述查询
您可以使用子查询:
DELETE
FROM dates
WHERE event_ref IN (*list of event_refs*)
AND person_ref IN (SELECT person_ref FROM (
SELECT person.person_ref
FROM person
JOIN dates ON dates.person_ref = person.person_ref AND dates.event_ref = 14
WHERE dates.date < CURDATE()) sub
)
您可以对相同的子查询使用内部联接 table
DELETE dates FROM dates
INNER JOIN (
SELECT person.person_ref
FROM person
JOIN dates ON dates.person_ref = person.person_ref AND dates.event_ref = 14
WHERE dates.date < CURDATE()) sub
) t on t.person_ref = dates. person_ref
AND event_ref IN (*list of event_refs*)
首先让我们缩短查询。你可以在这里去掉 person
table;你没有用它做什么。
DELETE
FROM dates
WHERE event_ref IN (*list of event_refs*)
AND person_ref IN
(
SELECT person_ref
FROM dates
WHERE event_ref = 14 AND date < CURDATE()
);
现在 MySQL 不喜欢直接访问要从中删除的 table。在 MySQL 中,您必须将 table 包装在一个伪子查询中:
DELETE
FROM dates
WHERE event_ref IN (*list of event_refs*)
AND person_ref IN
(
SELECT person_ref
FROM (SELECT * FROM dates) d
WHERE event_ref = 14 AND date < CURDATE()
);