Sql 使用“查询删除一个表中的记录”;不在「;子句来检查多个表。这个查询可以更简化吗?
现在我正在使用下面的查询Sql 使用“查询删除一个表中的记录”;不在「;子句来检查多个表。这个查询可以更简化吗?,sql,ms-access,Sql,Ms Access,现在我正在使用下面的查询 string myQry = "DELETE FROM myMainTbl AS a WHERE a.id NOT IN(SELECT b.mainid FROM mySubTbl_1 AS b WHERE b.mainid = a.id GROUP BY b.mainid HAVING MAX(b.sttime) > @mydate) AND a.id NOT IN(SELECT c.mainid FROM mySubTbl_
string myQry = "DELETE FROM myMainTbl AS a WHERE
a.id NOT IN(SELECT b.mainid FROM mySubTbl_1 AS b WHERE b.mainid = a.id GROUP BY b.mainid HAVING MAX(b.sttime) > @mydate)
AND
a.id NOT IN(SELECT c.mainid FROM mySubTbl_2 AS c WHERE c.mainid = a.id GROUP BY c.mainid HAVING MAX(c.sttime) > @mydate)
AND
a.id NOT IN(SELECT d.mainid FROM mySubTbl_3 AS d WHERE d.mainid = a.id GROUP BY d.mainid HAVING MAX(d.sttime) > @mydate)
AND
a.id NOT IN(SELECT e.mainid FROM mySubTbl_4 AS e WHERE e.mainid = a.id GROUP BY e.mainid HAVING MAX(e.sttime) > @mydate)
AND
a.id NOT IN(SELECT f.mainid FROM mySubTbl_5 AS f WHERE f.mainid = a.id GROUP BY f.mainid HAVING MAX(f.sttime) > @mydate)";
它能更简化吗?我建议
不存在而不是不存在。这看起来像:
NOT EXISTS (SELECT 1 FROM mySubTbl_1 AS b WHERE b.mainid = a.id AND b.sttime > @mydate)
如果日期后不存在匹配行,则最大值也不存在
然后,您可以添加索引来优化此查询:mySubTbl\u 1(mainid,sttime)
在查询方面,创建索引并使用:
DELETE FROM myMainTbl AS a
WHERE NOT EXISTS (SELECT b.mainid FROM mySubTbl_1 AS b WHERE b.mainid = a.id AND b.sttime > @mydate) AND
NOT EXISTS (SELECT c.mainid FROM mySubTbl_2 AS c WHERE c.mainid = a.id AND c.sttime > @mydate) AND
NOT EXISTS (SELECT d.mainid FROM mySubTbl_3 AS d WHERE d.mainid = a.id AND d.sttime > @mydate) AND
NOT EXISTS (SELECT e.mainid FROM mySubTbl_4 AS e WHERE e.mainid = a.id AND e.sttime > @mydate) AND
NOT EXISTS (SELECT f.mainid FROM mySubTbl_5 AS f WHERE f.mainid = a.id AND f.sttime > @mydate)";
我建议不存在
超过不存在
。这看起来像:
NOT EXISTS (SELECT 1 FROM mySubTbl_1 AS b WHERE b.mainid = a.id AND b.sttime > @mydate)
如果日期后不存在匹配行,则最大值也不存在
然后,您可以添加索引来优化此查询:mySubTbl\u 1(mainid,sttime)
在查询方面,创建索引并使用:
DELETE FROM myMainTbl AS a
WHERE NOT EXISTS (SELECT b.mainid FROM mySubTbl_1 AS b WHERE b.mainid = a.id AND b.sttime > @mydate) AND
NOT EXISTS (SELECT c.mainid FROM mySubTbl_2 AS c WHERE c.mainid = a.id AND c.sttime > @mydate) AND
NOT EXISTS (SELECT d.mainid FROM mySubTbl_3 AS d WHERE d.mainid = a.id AND d.sttime > @mydate) AND
NOT EXISTS (SELECT e.mainid FROM mySubTbl_4 AS e WHERE e.mainid = a.id AND e.sttime > @mydate) AND
NOT EXISTS (SELECT f.mainid FROM mySubTbl_5 AS f WHERE f.mainid = a.id AND f.sttime > @mydate)";
您可以将其重写为一个不存在的
,这样就不必担心组和聚合,并且可以合并数据以简化查询:
DELETE
FROM myMainTbl AS a
WHERE
NOT EXISTS(
SELECT 1 FROM (
SELECT mainid, sttime
FROM mySubTbl_1
UNION ALL
SELECT mainid, sttime
FROM mySubTbl_2
UNION ALL
SELECT mainid, sttime
FROM mySubTbl_3
UNION ALL
SELECT mainid, sttime
FROM mySubTbl_4
UNION ALL
SELECT mainid, sttime
FROM mySubTbl_5
) b
WHERE b.mainid = a.id AND sttime > @mydate
)
这在语义上对我来说也更清楚,您希望删除其中一个子表中不存在相关行且时间大于您的参数的所有行。您可以将其重写为不存在的
,这将避免担心组和聚合,并合并数据以简化查询:
DELETE
FROM myMainTbl AS a
WHERE
NOT EXISTS(
SELECT 1 FROM (
SELECT mainid, sttime
FROM mySubTbl_1
UNION ALL
SELECT mainid, sttime
FROM mySubTbl_2
UNION ALL
SELECT mainid, sttime
FROM mySubTbl_3
UNION ALL
SELECT mainid, sttime
FROM mySubTbl_4
UNION ALL
SELECT mainid, sttime
FROM mySubTbl_5
) b
WHERE b.mainid = a.id AND sttime > @mydate
)
这在语义上对我来说也更清楚,您希望删除其中一个子表中不存在相关行且时间大于您的参数的所有行。简短回答:您不能。MS Access不完全实现SQL-92(甚至Access 2019!),也不支持在删除中使用连接,请参见此处:据我所知,MS Access不支持名为参数的T-SQL样式(例如@mydate
),因此您的查询无论如何都无法工作。请确认您在MS Access中使用的是JET Red或ACE,或者您正在将Access用作SQL Server或其他ODBC/OLE-DB数据库的前端。这似乎是为了防止无意中删除外键关系中的主体实体。实现这一点的方法是通过强制FK约束——这样你就不需要过滤DELETE
语句:相反,如果DBMS违反约束,它只会抛出一个错误。简短回答:你不能。MS Access不完全实现SQL-92(甚至Access 2019!),也不支持在删除中使用连接,请参见此处:据我所知,MS Access不支持名为参数的T-SQL样式(例如@mydate
),因此您的查询无论如何都无法工作。请确认您在MS Access中使用的是JET Red或ACE,或者您正在将Access用作SQL Server或其他ODBC/OLE-DB数据库的前端。这似乎是为了防止无意中删除外键关系中的主体实体。实现这一点的方法是通过强制FK约束——这样你就不需要过滤你的DELETE
语句:相反,如果DBMS违反了约束,它只会抛出一个错误。非常感谢,它通过Union工作得很好,很简单,很快。非常感谢,它通过Union工作得很好,很简单,很快。