QA@IT

複数の値の一致状況をチェックする方法について(MySQL)

6603 PV

複数の値の一致状況をチェックする方法について最良の方法を知りたいです。

1,2,3,4の値の存在可否をチェックする際、
"~ WHERE abc IN (1,2,3,4)"とすれば、一致するレコードを取得できますが、一致していない場合のレコード結果も取得したいと思っています。(レコードベースではなく、検索値ベースで結果を取得したい形です。)

例:
○レコード
|abc |
|1 |
|3 |
|10 |



○検索値
1,2,3,4

○希望結果
|cond |abc |
|1 |1 |
|2 |NULL|
|3 |3 |
|4 |NULL|

※↑要点のみ記載

 
上記は一時テーブルを作成すれば、簡単に実現できるかと思いますが、一時テーブルを作成せず、1回の問い合わせで結果を取得したいと思っています。(手軽に扱いたいです)
上記が解決できそうなSQL文はありますでしょうか?
(上記を実現したい理由は、処理の改善が目的です。)

回答

丁寧な回答有難うございます。

申し訳ありません、UNION,SELECTで組み合わせる方法は、当初より検討していました。(質問の前提に含めるべきでした。)

UNION+SELECTについては、シンプル+手軽に扱いたいと考えているため、もう少々いい方法はないかと思っている次第です。

検索値が少し多くなるだけで、SQL文が膨大になってしまう点が大きなデメリットだと思っています。できれば検索値の個数が2,3程度から数十程度まで幅広く対応できる手法が大変助かります。

引き続きよろしくお願いします。

編集 履歴 (0)
SELECT cond, abc
FROM (
 SELECT 1 AS cond
 UNION ALL
 SELECT 2 AS cond
 UNION ALL
 SELECT 3 AS cond
 UNION ALL
 SELECT 4 AS cond
) AS COND_TABLE
LFET OUTER JOIN TARGET_TABEL ON TARGET_TABEL.abc = COND_TABLE.cond

一時テーブルでできるなら、同じことをインラインビューでやればできます。
ただ、パフォーマンス上は一時テーブルに軍配が上がることが多いので、忌避せず使った方がいいと思いますけどね。
↑くらいだとあんま変わらないだろうけれど。
DDL発行を嫌がる環境は結構あるので、どうしようもないこともありますけどね。

編集 履歴 (0)
  • 回答有難うございます! -
SELECT B.abc cond, A.abc FROM tb_test A
RIGHT JOIN (SELECT 1 abc) B using (abc)
UNION ALL
SELECT B.abc, A.abc FROM tb_test A
RIGHT JOIN (SELECT 2 abc) B using (abc)
UNION ALL
SELECT B.abc, A.abc FROM tb_test A
RIGHT JOIN (SELECT 3 abc) B using (abc)
UNION ALL
SELECT B.abc, A.abc FROM tb_test A
RIGHT JOIN (SELECT 4 abc) B using (abc);

これでできますね。

編集 履歴 (0)
  • 回答有難うございます! -
ウォッチ

この質問への回答やコメントをメールでお知らせします。