おすすめ本

最近のトラックバック

  • event (夢茶爺&苦茶爺のPC奮戦備忘録)

AccRanking

Ad

« 2018年9月 | メイン | 2018年11月 »

2018年10月

2018年10月19日 (金)

【MySQL】UNION MINUS が無いので、代わりに NOT EXISTS を使う方法について

MySQLUNION MINUS が出来ないので、代わりに NOT EXISTS を使って実現します。
前回の記事の ユーザ変数を使って連番や、連続日付を取得する方法について のSQL文を参考にします。

8個の連続日付から、途中の4件を差し引く例を以下に示します。
最初の方のFROM句の中は、10日分の連続日付を生成するテーブル定義になります。
また、 NOT EXISTS 句のFROM句の中は、途中の日付から4日分の連続日付を生成するテーブルとなります。
それぞれのテーブルを日付カラムでリンクを行うと、出力として4日分の日付が中抜けした結果になります。
実行結果は以下の様になります。


楽天市場

■関連記事
【MySQL】ダミーテーブルをUNIONで連結してコード表を作成する方法
【MySQL】ユーザー変数を使ってSELECTに行番号を付加する方法
【MySQL】カラム名を囲むバッククオートについて
【MySQL】UNIONMINUSが無いので、代わりにNOTEXISTSを使う方法について
【MySQL】ユーザ変数を使って連番や、連続日付を取得する方法について

【MySQL】ユーザ変数を使って連番や、連続日付を取得する方法について

仕事の中で連番のみの仮想的なテーブルがほしい場合があったので、調べてみたところ、その解決方法としてユーザ変数を使って SQL文1個でできる様なので、その件を記します。

SQL文は以下の様に、2個のSELECT文をUNIONで連結しています。 最初のSELECT文でユーザ変数 @num を初期化し、2個目のSELECT文で @num を順次1加算し、表示することになります。 さらに LIMIT句 で何個までを生成するのかを指定します。
ただ、FROM句には実際のテーブルが必要ですので、あらかじめ TEST と命名したテーブルを作成しておきました。 TEST の中身はなんでもいいのですが、とにかく欲しい連番までのレコード(行)が必要です。
なるべくレコード数が多い方がいいのですが、特別に TEST などというテーブルを作成しなくても MySQLインストール時に生成されるシステムDBのテーブルを使ってもできます。

いろんな方のサイトを見ると、`information_schema`.COLUMNS を使っているのを多く見かけます。 実際このテーブルのレコード数は10万件以上ありますので、これを使うのがいいのではと思います。
実行結果は以下の様になります。
また、この方法を応用して、連続日付の生成を行います。以下のSQLを見て下さい。 @num の部分を @dat として日付発生させるように変更しています。
実行結果は以下の様になります。


楽天市場

■関連記事
【MySQL】ダミーテーブルをUNIONで連結してコード表を作成する方法
【MySQL】ユーザー変数を使ってSELECTに行番号を付加する方法
【MySQL】カラム名を囲むバッククオートについて
【MySQL】UNIONMINUSが無いので、代わりにNOTEXISTSを使う方法について
【MySQL】ユーザ変数を使って連番や、連続日付を取得する方法について