Austauschvariablen Oracle SQL mehrfach verwenden?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

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.

Woher ich das weiß:Berufserfahrung – Softwareentwickler/Projektleiter seit 2012

dablaha 
Fragesteller
 24.06.2019, 09:52

Wenn du das AND vor EXISTS durch ein WHERE ersetzt funktioniert dein Code genauso wie ich es mir vorstelle, danke dir.

0
apachy  24.06.2019, 16:11
@dablaha

Ah sorry, hat es nicht getestet, ist mir tatsächlich entgangen :)

0
dablaha 
Fragesteller
 24.06.2019, 16:32
@dablaha

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.

0
apachy  24.06.2019, 17:02
@dablaha

Du könntest die Variable natürlich einfach mit einem SELECT FROM DUAL rein joinen, sprich etwas ala:

SELECT * FROM TABLE t1
CROSS  JOIN (SELECT '&name' AS Name FROM DUAL) t2
WHERE  UPPER(t1.last_name) != UPPER(t2.Name)

usw.

0
apachy  24.06.2019, 17:08
@apachy

Btw du kannst den Doppelpunkt nutzen, dann kriegst du ein anderes Fenster, musst jedoch die Variable nur einmal binden. Dafür dann die Anführungszeichen weglassen:

SELECT :Name, :Name FROM DUAL
0