sql >> データベース >  >> RDS >> Mysql

MySQL-テーブルのidフィールドに対応するものがない番号のリストから選択します

    これは非常に一般的な問題です。テーブルを作成せずにその場でリレーションを生成します。この問題のSQLソリューションはかなり厄介です。派生テーブルを使用した1つの例:

    SELECT n.id
    FROM
      (SELECT 2 AS id 
       UNION SELECT 3 
       UNION SELECT 4 
       UNION SELECT 5 
       UNION SELECT 6 
       UNION SELECT 7) AS n
      LEFT OUTER JOIN foos USING (id)
    WHERE foos.id IS NULL;
    

    ただし、6つではなく多くの値がある可能性があるため、これはあまり適切にスケーリングされません。 1つのUNIONで長いリストを作成するのは面倒になる可能性があります 値ごとに必要です。

    もう1つの解決策は、10桁の汎用テーブルを手元に置いておき、それを複数の目的に繰り返し使用することです。

    CREATE TABLE num (i int);
    INSERT INTO num (i) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);
    
    SELECT n.id
    FROM 
      (SELECT n1.i + n10.i*10 AS id
       FROM num AS n1 CROSS JOIN num AS n10
       WHERE n1.i + n10.i*10 IN (2, 3, 4, 5, 6, 7)) AS n
      LEFT OUTER JOIN foos USING (id)
    WHERE foos.id IS NULL;
    

    この場合は必要ありませんが、0..99から値を生成する内部クエリを示しています。ただし、リストに10より大きい値がある場合があります。重要なのは、1つのテーブルでnum 、1つのUNIONで非常に長いチェーンに頼ることなく、多数を生成できます。 値ごと。また、必要な値のリストを1か所で指定できるため、より便利で読みやすくなります。



    1. ClusterControlを使用してMySQLバックアップを検証する方法

    2. SQLServerのログオントリガー

    3. MariaDB JSON_QUOTE()の説明

    4. リモートで関連するテーブルから値をチェックするためのCONSTRAINT(結合などを介して)