2016-11-14 39 views
-1

同じサーバー(dbAとdbB)に2つのデータベースがあります。どちらもCUSTOMERSという表があります。私は顧客の年齢を計算し、現在の日付とdbA.CUSTOMERSテーブルのDateOfBirth列に基づいて、dbB.CUSTOMERSの列AGEに入れたいと思います。私はOracle SQLで年齢を計算する方法

SELECT floor(months_between(SYSDATE, (SELECT BIRTH_DATE FROM dbA.CUSTOMERS)) /12) from dual; 

を使用しようとしたが、これは私がサブクエリがBirth_Dateの列のすべての行を返すため、これは推測していORA-01427:single-row subquery returns more than one row

を返す年齢を計算するには

。そこにすべての行のためにこれを行うと、dbB.CUSTOMERSテーブルに結果を挿入するsomewayですか?私は、サブクエリを使用してOracleSQL

+2

なぜですか?年齢は年齢とともに変化します。必要に応じて関数をビルドして呼び出すほうがよいでしょう。決定的だった場合は、関数ベースのインデックスを使用できます。しかし、これは決定論的ではないので、再びなぜですか?私には関数がここでよりうまく使えるように見えます。 – xQbert

+0

@xQbertこれはエクササイズ用ですので、時間の経過と共に変化する年齢は無関係です。 – Akaitenshi

+2

非常に良く選ばれていない運動。インストラクターが実証しようとしているものが何であれ、彼らは現実の世界で実際に行うことに似ている、より良い例を選ぶべきです。この割り当ては現実世界では非常にばかげているだろうし、テーブルに年齢を格納することが何らかの意味をなさないことを示唆したり示唆したりすることなく、まったく同じ機能やテクニックなどを示す意味のある課題を思いつくのは非常に簡単だろう。ちょうど私の2セント... – mathguy

答えて

1

にサブクエリの必要がここにありません

select floor(months_between(sysdate,BIRTH_DATE)/12) as Age 
from CUSTOMERS 

を使用しています

は、テーブルのすべての行を返し、それらのすべてに対して機能を適用することはできません。このメソッドは各行に対して関数を適用するため、動作します

+0

うわー、それは簡単でした。他のDBから列を取得するためにサブクエリが必要だと思った。ありがとうございました。 – Akaitenshi

関連する問題