UNION集合演算と重複行の排除

SQL における集合演算子 `UNION` は、2つの問い合わせ結果を統合した上で「重複行を自動的に排除(DISTINCT)」して一意な行集合を返します。 一方、`SELECT * FROM R`(SQL文2)は表 R に格納されているすべての行をそのまま出力するため、表 R 内に同一内容の行(重複行)が存在する場合、それらの重複行はそのまま出力されます。 したがって、両者の実行結果(行集合および行数)が完全に一致するための必要十分条件は、「表 R に最初から重複する行が存在しない」ことです。 よって、ウ が正解です。 UNION の重複排除処理において NULL は他の値と同様に「同一の値」として扱われ、重複があれば1行にまとめられます。主キーに NULL がないこと(実体整合性)は同一結果を得るための必要十分条件ではありません。 行数が 0(空表)であれば確かに結果は一致しますが、行が複数あっても重複行がなければ一致するため、必要十分条件ではありません(十分条件にすぎない)。 行数が 1 の場合も一致しますが、行数が 2 以上であっても重複がなければ一致するため、必要十分条件ではありません。

SQL文1 と SQL文2 を実行した結果が同一になるために, 表 R が満たすべき必要十分な条件はどれか。

〔SQL文 1〕 SELECT * FROM R UNION SELECT * FROM R

〔SQL文 2〕 SELECT * FROM R

出典2022r04a_db_am2_問9
ア
主キーに NULL をもつ行は存在しない。
イ
行数が 0 である。
ウ
重複する行は存在しない。
エ
行数が 1 である。