質問: 下表のようなデータがあるとして、「A」列と「D」列で以下のように絞り込みを行います。 「A」列:1000 「D」列:1A その場合、通常なら4行目までのデータが表示されると思いますが 絞り込みにより取得された「A」「B」列の値を条件にして、 該当しているものを下表の「※」列記載のように表示させたいと考えています。 本来あれば5、6行目は取得されませんが、 「A」列で取得した「1000」という値が該当しているため表示させたい ということです。 「※」列は補足として用意したもので、本来はありません。 --- 表1 Table:XYZ | # | A | B | C | D | ※1 | | --- | --- | --- | --- | --- | --- | | 1 | 1000 | 201 | 002 | 1A | 絞り込みで表示される | | 2 | 1000 | 202 | 001 | 1A | 絞り込みで表示される | | 3 | 1000 | 202 | 002 | 1A | 絞り込みで表示される | | 4 | 1000 | 203 | 001 | 1A | 絞り込みで表示される | | 5 | 1000 | 204 | 001 | 2A | 絞り込みで表示されないが、表示されるようにしたい | | 6 | 1000 | 204 | 002 | 2A | 絞り込みで表示されないが、表示されるようにしたい | | 7 | 1001 | 205 | 001 | 2A | 絞り込みで表示されない | --- インラインビューを使用することで実現できそうだ というところまでわかっていますが、 そこから先の構築がわからず詰まっています。 どなたかお力添えいただければ幸いです。 何卒宜しくお願い致します。 SQL ,SQL Server ,SQL ,Server Reporting Server
回答: レコード 1, 2, 3, 4 と 5, 6 を区別したいのであれば、 質問欄の※列に該当する意味を持つ列を作ってしまうのがよいでしょう: ``` SELECT XYZ.#, XYZ.A, XYZ.B, XYZ.C, XYZ.D, INLINE.# AS ※1 FROM XYZ LEFT JOIN ( SELECT # FROM XYZ WHERE A = 1000 AND D = "1A" ) AS INLINE ON XYZ.# = INLINE.# WHERE A = 1000 OR D = "1A"; ``` | # | A | B | C | D | ※1 | | --- | --- | --- | --- | --- | --- | | 1 | 1000 | 201 | 002 | 1A | 1 | | 2 | 1000 | 202 | 001 | 1A | 2 | | 3 | 1000 | 202 | 002 | 1A | 3 | | 4 | 1000 | 203 | 001 | 1A | 4 | | 5 | 1000 | 204 | 001 | 2A | NULL | | 6 | 1000 | 204 | 002 | 2A | NULL | そして、アプリケーションで `※1` 列の値に従って 表示する・しない を切り替えます 考え方 例えば、次のような SQL でレコード 1, 2, 3, 4, 5, 6 が取得できます: ``` SELECT A, B, C, D FROM XYZ WHERE A = 1000 OR D = "1A"; ``` また、次のような SQL でレコード 1, 2, 3, 4 のみを取得できます: ``` SELECT A, B, C, D FROM XYZ WHERE A = 1000 OR D = "1A"; ``` この 2 つのクエリーをインラインビューで組み合わせます このとき、たくさんの行を取得する方から、少しの行を取得する方に向かって `LEFT JOIN` することに気をつけます