Austauschvariablen Oracle SQL mehrfach verwenden?
Ich habe das Problem, dass ich es nicht schaffe eine Austauschvariable, innerhalb einer Ausführung, mehrfach zu verwenden .(Ich will nicht zwei mal nach dem gleichen gefragt werden.) Bei jeder Ausführung des SQL-Datei will ich gefragt werden. Hier ein paar Ansätze wie ich es mir vorstelle, es jedoch noch nicht funktioniert hat. (Oracle SQL-Developer)
SELECT last_name, hire_date
FROM employees
WHERE (UPPER('&name')!=UPPER(last_name))
AND department_id = (SELECT department_id
FROM employees
WHERE UPPER('name')=UPPER(last_name));
ODER:
SELECT last_name, hire_date
FROM employees
WHERE (UPPER('&&name')!=UPPER(last_name))
AND department_id = (SELECT department_id
FROM employees
WHERE UPPER('&name')=UPPER(last_name))
UNDEFINE name;
ODER:
DEFINE name1 = &name
SELECT last_name, hire_date
FROM employees
WHERE (UPPER('name1')!=UPPER(last_name))
AND department_id = (SELECT department_id
FROM employees
WHERE UPPER('name1')=UPPER(last_name));
UNDEFINE name1;
1 Antwort
Nun ich hab den SQL Developer von Oracle nicht drauf, sondern den PL/SQL Developer. Würde aber vermuten das du beide male &name schreiben kannst?
Sofern das nicht geht, funktioniert die Abfrage natürlich auch mit nur einer Variable. Du kannst den äußeren Vergleich ja auch dadurch erreichen, dass du mit dem last_name des inner SELECTs vergleichst:
SELECT last_name, hire_date
FROM employees t1
AND EXISTS (
SELECT 1 FROM employees t2
WHERE UPPER('&name') = UPPER(t2.last_name)
AND UPPER(t1.last_name) != UPPER(t2.last_name)
AND t2.department_id = t1.department_id
)
So hast du immer EXISTS die Verknüpfung Variable = last_name und machst gleichzeitig den Vergleich nach draußen. Da t2.last_name in dem Fall das gleiche ist, wie deine Variable, kannst du damit vergleichen, anstatt ein zweites mal mit der Variabel zu vergleichen.
Man kann in diesen Fall das Problem von mir in diesem Fall auch mit einem Self Join anstatt einer Unterabfrage (wie ich es zuerst versucht habe lösen),
SELECT e.last_name, e.hire_date
FROM employees e
JOIN employees f
ON(UPPER(f.last_name) = UPPER('&name'))
WHERE (UPPER(f.last_name)!=UPPER(e.last_name))
AND f.department_id = e.department_id;
da man die Variable nur zweimal benutzt. Trotzdem wäre es interessant wie man das Problem löst, wenn man die Austauschvariable 10x in seinen Quelltext benötigt. Unsere Ansätze machen aus 2x Benutzen nur noch 1x Benutzen der Austauschvariablen.
Wenn du das AND vor EXISTS durch ein WHERE ersetzt funktioniert dein Code genauso wie ich es mir vorstelle, danke dir.