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

フィールド間の違いについてテーブルの行を比較する

    SQLの式は、1行の列のみを参照する必要があります(サブクエリを除く)。

    JOIN 2つの異なる行を結果セットの1つの行にするために使用できます。

    したがって、自己結合を実行することにより、異なる行の値を比較できます。これは、各行を同じクライアントに関連付けられている他のすべての行に結合することを示す例です(行のそれ自体への結合を除く):

    SELECT c1.*, c2.*
    FROM client c1
    JOIN client c2 ON (c1.clientID = c2.clientID AND c1.id <> c2.id)
    

    これで、列を比較する式を記述できます。たとえば、上記のクエリをfield1が異なるクエリに制限するには:

    SELECT c1.*, c2.*
    FROM client c1
    JOIN client c2 ON (c1.clientID = c2.clientID AND c1.id <> c2.id)
    WHERE c1.field1 <> c2.field1;
    

    必要な比較の種類は指定しないので、お任せします。重要な点は、一般に、自己結合を使用して特定のテーブルの行を比較できることです。

    コメントと説明を再確認してください。わかりました。つまり、「違い」は単に値ではなく、行の序数によるものです。リレーショナルデータベースには行番号の概念がなく、ORDER BYで指定する必要のある順序に関する行の順序しかないことに注意してください。 句。 「id」と混同しないでください 「行番号付きの疑似キー。番号は、実装の一致によってのみ単調に増加するように割り当てられます。

    MySQLでは、ユーザー定義変数<を利用できます。 / a> あなたが探している効果を達成するために。 clientIdでクエリを並べ替えます 次にid 、およびMySQLユーザー変数の列ごとの値を追跡します。現在の行の値が変数の値と異なる場合は、強調表示することをすべて実行します。 1つのフィールドの例を示します:

    SET @clientid = -1, @field1 = '';
    SELECT id, clientId, field1, @clientid, @field1,
      IF(@clientid <> clientid, 
        ((@clientid := clientid) AND (@field1 := field1)) = NULL,
        IF (@field1 <> field1, 
          (@field1 := field1), 
          NULL
        )
      ) AS field1_changed
    FROM client c
    ORDER BY clientId, id;
    

    このソリューションは、プレーンSQLですべての行を選択し、行をフェッチするときにアプリケーション変数で値を追跡することと実際には違いがないことに注意してください。




    1. 異なるDBで外部キーを使用してdjangoモデルを使用するにはどうすればよいですか?

    2. リテラルを使用したMysql正規表現エラー#1139-

    3. postgresqlhibernateでuserという名前のテーブルを使用できません

    4. PL/pgSQLの列名は変数と同じ