Calcolo di un campo dalla query SQL selezionando da più tabelle con unione
-
27-10-2019 - |
Domanda
Ho la seguente domanda, che funziona alla grande. Il problema che ho è che in entrambe le tabelle (e la tabella unionaria aggregata) c'è un campo chiamato mtguid. Devo moltiplicare Mtguid per un numero (diciamo 1,35, per facilità d'uso) e fargli restituire quel numero nel campo mtguid. Ho provato una dozzina di modi per farlo e non riesco a fare nulla per giocare a palla. Posso creare una nuova colonna per ciascun prezzo calcolato, come (bkretail.mtguid * 1.35) come mtg1, ma abbiamo decine di migliaia di righe di codice che usano specificamente MTguid. Qualche idea?
Sto usando Firebird SQL.
SELECT * FROM (
SELECT BKRETAIL.* FROM BKRETAIL WHERE BKRETAIL.MKEY='SOMEKEY'
UNION SELECT BKWHOLESALE.* FROM BKWHOLESALE WHERE MKEY='SOMEKEY')
ORDER BY
case STATUS
WHEN 'RT' then 1
WHEN 'WH' then 2
WHEN 'OL' then 3
WHEN 'OD' then 4
WHEN NULL then 5
else 6
end;
Soluzione
Cosa ne pensi di questo:
SELECT MTGUID * 1.35 as calculatedMTGUID, SUBSEL.* FROM (
SELECT BKRETAIL.* FROM BKRETAIL WHERE BKRETAIL.MKEY='SOMEKEY'
UNION SELECT BKWHOLESALE.* FROM BKWHOLESALE WHERE MKEY='SOMEKEY') SUBSEL
ORDER BY
case STATUS
WHEN 'RT' then 1
WHEN 'WH' then 2
WHEN 'OL' then 3
WHEN 'OD' then 4
WHEN NULL then 5
else 6
end;
Altri suggerimenti
prova questo
SELECT MTGUID * 1.35 AS MTGUID,<list rest OF COLUMNS here>
FROM (
SELECT BKRETAIL.* FROM BKRETAIL WHERE BKRETAIL.MKEY='SOMEKEY'
UNION SELECT BKWHOLESALE.* FROM BKWHOLESALE WHERE MKEY='SOMEKEY')
ORDER BY
case STATUS
WHEN 'RT' then 1
WHEN 'WH' then 2
WHEN 'OL' then 3
WHEN 'OD' then 4
WHEN NULL then 5
else 6
end;
Un'opzione sarebbe quella di sostituire l'originale MTGUID
colonna con una calcolata, cioè
- rinominare l'originale
MTGUID
colonna nella tabella (s); - aggiungere nuova
MTGUID
colonna con espressione desiderata usandoCOMPUTED BY (expr)
;
Il vantaggio di questo è che non è necessario modificare le tue dichiarazioni SQL, lo svantaggio è che devi mantenere l'espressione in molti luoghi (tutte le tabelle che hanno la colonna). Naturalmente, le query che richiedono il valore MTGuid originale devono essere aggiornate per utilizzare la colonna Rinomina, ma se il numero di tali affermazioni è significativamente inferiore, potrebbe valere la pena.
Penso che una soluzione migliore sarebbe quella di "nascondere" tutte queste cose dietro una vista, ma ciò richiede di avvisare le tue query SQL ...