「NOTIN」句を使用して複数のテーブルをチェックすることにより、1つのテーブルのレコードの削除をクエリします。このクエリをもっと単純化できますか?

ムルリマダブ

現在、以下のクエリを使用しています

 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)";

もっと単純化できますか?

エリックA

これをに書き換えることができます。これにより、NOT EXISTSグループや集計について心配する必要がなくなり、データを結合してクエリを簡略化できます。

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
    )

これは意味的にもはるかに明確です。パラメータよりも長い時間で、サブテーブルの1つに関連する行が存在しないすべての行を削除する必要があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ