コマンド道場
IN / EXISTS難易度 ★★★☆☆

EXISTS で存在を調べる

juchu テーブルから、数量が 10 以上の明細を 1 行でも含む受注を取り出してください。列は「juchu_id, juchu_on, status」の順、juchu_id の小さい順に並べてください。

この書き方が使えない製品があります そのまま使える: PostgreSQL / MySQL / MariaDB / SQLite / SQL Server / Oracle Database

未確認: IBM Db2

製品ごとの対応表(実測)を見る

  • EXISTS は「その副問い合わせが 1 行でも返すか」を判定します。返す中身は見ないので SELECT 1 で構いません。
  • 結合して DISTINCT を取る書き方でも同じ結果になりますが、EXISTS の方が意図が明確です。
● 起動中…

この問題で使えるテーブル(名前をタップすると入力できます)

10

NULL
🔑int不可
int不可
date不可
text不可
データを見る(先頭 5 行)
juchu_idkokyaku_idjuchu_onstatus
100112025-11-05done
100222025-11-18done
100312025-12-02done
100432025-12-09cancel
100542025-12-24done

17

NULL
🔑int不可
🔑int不可
int不可
int不可
numeric(10,0)不可
データを見る(先頭 5 行)
juchu_idgyo_noshohin_idsuryotanka
10011120180
10012230120
100214223800
100225118500
10031644200

5

NULL
🔑int不可
text不可
text
date不可
データを見る(先頭 5 行)
kokyaku_idkokyaku_nameprefcreated_on
1青葉工業東京都2024-05-10
2白樺物産大阪府2024-08-01
3黒松システム東京都2025-01-15
4赤坂商会NULL2025-03-20
5三田商事愛知県2025-06-01

7

NULL
🔑int不可
text不可
text不可
numeric(10,0)不可
データを見る(先頭 5 行)
shohin_idshohin_namecategoryprice
1ノート文具180
2ボールペン文具120
3付箋文具250
4デスクチェア家具24800
5書棚家具18500

解説

結論

「条件に合う相手が 1 つでもあるか」は EXISTS で書きます。

なぜ

EXISTS は副問い合わせが 1 行でも返せば真になり、中身は見ません。だから SELECT 1 で十分です。結合で書くと 1 件の受注が明細の数だけ複製されるため、DISTINCT が必要になります。EXISTS なら元の行数が保たれます。

副問い合わせの中で外側の列(j.juchu_id)を参照している点に注目してください。これがあるから「その受注の明細」に限定できます。参照を忘れると、どの受注でも同じ判定になってしまいます。

よくある間違い

①副問い合わせ内で外側を参照し忘れる ②条件を副問い合わせの中に書き忘れる。

根拠(一次情報)