2016-11-14 4 views
-1

Ich habe zwei Datenbanken auf dem gleichen Server (dbA und dbB). Beide haben eine Tabelle namens KUNDEN. Ich möchte das Alter meiner Kunden berechnen und es auf einer Spalte AGE, auf dem dbB.CUSTOMERS, basierend auf dem aktuellen Datum und der DateOfBirth-Spalte in der dba.CUSTOMERS-Tabelle einfügen.Wie Alter in Oracle SQL zu berechnen

das Alter zu berechnen, ich

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

aber dies gibt ein ORA-01427:single-row subquery returns more than one row

Ich vermute, dies liegt daran, dass die Unterabfrage gibt jede Zeile der BIRTH_DATE Spalte zu verwenden versucht. Gibt es eine Möglichkeit, dies für alle Zeilen zu tun und dann das Ergebnis in meine Tabelle dbB.CUSTOMERS einzufügen?

Ich bin mit OracleSQL

+2

Warum? Das Alter ändert sich im Laufe der Zeit. Sie sollten besser eine Funktion erstellen und aufrufen, wenn sie benötigt wird. Wenn es deterministisch wäre, könnten Sie einen funktionsbasierten Index verwenden; aber das ist nicht deterministisch, also nochmal warum? Scheint mir eine Funktion hier besser zu nutzen. – xQbert

+0

@xQbert Dies ist für eine Übung, so dass das Alter im Laufe der Zeit ist irrelevant. – Akaitenshi

+2

Sehr schlecht gewählte Übung. Was immer der Instruktor versucht zu demonstrieren (oder zu testen), sie sollten bessere Beispiele wählen, die denen ähneln, die man tatsächlich in der realen Welt machen würde. Diese Aufgabe wäre in der realen Welt ziemlich idiotisch, und es wäre sehr einfach, eine aussagekräftige Aufgabe zu entwickeln, die genau die gleichen Merkmale, Techniken usw. demonstriert, ohne zu vermuten, dass das Speichern von Altersangaben in einer Tabelle Sinn macht. Nur meine 2 Cent ... – mathguy

Antwort

1

Es besteht keine Notwendigkeit für die Unterabfrage hier

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

Mit Hilfe der Unterabfrage gibt alle Zeilen für die Tabelle und die Funktionen gegen alle von ihnen nicht anwenden können. Diese Methode wendet die Funktion auf jede Zeile an, so dass sie funktioniert

+0

Wow, es war so einfach. Ich dachte, ich brauche die Unterabfrage, um die Kolumne von der anderen DB zu holen. Vielen Dank. – Akaitenshi