Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用“查询删除一个表中的记录”;不在「;子句来检查多个表。这个查询可以更简化吗?_Sql_Ms Access - Fatal编程技术网

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工作得很好,很简单,很快。