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

MySQLクエリで重複する結果を非表示にする

    常に方法があります。問題は「これをすべきか」です。これを行うと、ブランドデータが非表示になることに注意してください。データが並べ替えられ、並べ替えられると、ソーターはどのブランドがどの行に対応しているかを知ることができなくなります。これが、ユーザーがデータを操作できないPDFに頼ったり、期待されたりしない印刷されたレポートである場合は、OKです。しかし、そうであれば、ユーザーはダンプして後で優れた操作を行うことができます...すべてのデータ。

    私は個人的に、この情報の表示は電子データでは不快だと思いますが、印刷されたフォームや静的なレポートでは問題ありません。理由:電子では、Excelにインポートして、データを操作できます。ただし、列に冗長データが「欠落」していると、電子操作が問題になります。

    動作中のSQLfiddle

    CREATE Table foo (
     brand varchar(20),
     description varchar(20),
     prodcode varchar(20));
    
    
    Insert into foo values ('Brand1', 'Description1', 'Product1'),
    ('Brand1', 'Description2', 'Product2'),
    ('Brand1', 'Description3', 'Product4'),
    ('Brand2', 'Description3', 'Product4'),
    ('Brand2', 'Description3', 'Product4'),
    ('Brand1', 'Description3', 'Product3');
    

    クエリ:

    SELECT case [email protected] <> f.brand then @Var :=brand end as Brand
         , f.description
         , f.prodcode
    FROM (SELECT * FROM foo ORDER BY brand, description, prodcode) f
    CROSS JOIN  (SELECT @var := '') b
    

    結果:

    Brand   description     prodcode
    Brand1  Description1    Product1
    (null)  Description2    Product2
    (null)  Description3    Product3
    (null)  Description3    Product4
    Brand2  Description3    Product4
    (null)  Description3    Product4
    

    これが機能する理由:

    魔法はクロスジョインとケース評価で起こります。

    テーブルが1つあります。参加する前にレコードを並べ替えています。 @varというユーザー変数を作成し、テーブルfooの最初のレコードで''に設定しています。次に、@varを最初のレコードのブランドに割り当てます。 SQLクロスが2番目にファイルされた@varに結合すると、最初のレコードのブランドになります。ブランドが一致する場合、レコードは表示されません。ブランドが一致しない場合、@ varの値を変更して、新しい値を表示します。

    リスク:

    • 他のテーブル結合が発生した場合、またはテーブルでの順序が希望どおりでない場合は、最初に「foo」でサブクエリを実行してブランド別に順序付けする必要があります
    • brand1を含むこれに注文を適用することは今では価値がありません
    • 再利用可能ではありません。データ(ビュー)を活用したい別のモジュールは、ブランドが一部のレコードに隠されているため、利用できなくなりました。


    1. 新しいMicrosoftSQLServerODBCおよびOLEDBドライバーのもつれを解く

    2. Oracleはエラー時にトランザクションをロールバックしますか?

    3. パンダto_sqlが重複する主キーで失敗する

    4. 週番号から週の開始日と終了日を取得します