日曜日, 12月 09, 2007
[SQL]同じ構造で複数テーブルのデータを取得
▼質問
同じ構造をしたテーブルが複数あるときに、SQLで簡単にデータを取得することはできないの?
▼回答
UNIONを使えばできるよ。重複行は削除されるから気をつけてね。
重複行を有効にしたい時は、UNION ALLにすればできるよ。
SELECT * FROM テーブル1 WHERE フィールド1 = 値 UNION SELECT * FROM テーブル2 WHERE フィールド1 = 値
ORDER BY フィールド1とすると次のようなエラーになるんだ。
ORA-00904: "フィールド1": 無効な識別子です。
どうしてなんだ?
*をしている時は、フィールド番号を指定しないと駄目なんだ。
SELECT * FROM テーブル1 WHERE フィールド1 = 値 UNION SELECT * FROM テーブル2 WHERE フィールド1 = 値 ORDER BY 1 asc
フィールド名をしてしたい時は、*に全てのフィールドを
指定してやる必要があるんだ。
わかったかい?!
SELECT フィールド1,フィールド2,フィールド3 FROM テーブル1 WHERE フィールド1 = 値 UNION SELECT フィールド1,フィールド2,フィールド3 FROM テーブル2 WHERE フィールド1 = 値 ORDER BY フィールド1 asc
同じ構造をしたテーブルが複数あるときに、SQLで簡単にデータを取得することはできないの?
▼回答
UNIONを使えばできるよ。重複行は削除されるから気をつけてね。
重複行を有効にしたい時は、UNION ALLにすればできるよ。
SELECT * FROM テーブル1 WHERE フィールド1 = 値 UNION SELECT * FROM テーブル2 WHERE フィールド1 = 値
ORDER BY フィールド1とすると次のようなエラーになるんだ。
ORA-00904: "フィールド1": 無効な識別子です。
どうしてなんだ?
*をしている時は、フィールド番号を指定しないと駄目なんだ。
SELECT * FROM テーブル1 WHERE フィールド1 = 値 UNION SELECT * FROM テーブル2 WHERE フィールド1 = 値 ORDER BY 1 asc
フィールド名をしてしたい時は、*に全てのフィールドを
指定してやる必要があるんだ。
わかったかい?!
SELECT フィールド1,フィールド2,フィールド3 FROM テーブル1 WHERE フィールド1 = 値 UNION SELECT フィールド1,フィールド2,フィールド3 FROM テーブル2 WHERE フィールド1 = 値 ORDER BY フィールド1 asc