Dokumentacja referencyjna the UPDATE statement na DB2 LUW 9,7 podaje następujący przykład:
UPDATE (SELECT EMPNO, SALARY, COMM,
AVG(SALARY) OVER (PARTITION BY WORKDEPT),
AVG(COMM) OVER (PARTITION BY WORKDEPT)
FROM EMPLOYEE E) AS E(EMPNO, SALARY, COMM, AVGSAL, AVGCOMM)
SET (SALARY, COMM) = (AVGSAL, AVGCOMM)
WHERE EMPNO = '000120'
Nawiasy po aktualizacji mogą zawierać pełny-select, czyli żadnego ważnego oświadczenia SELECT może tam pojechać.
Na tej podstawie, chciałbym zaproponować następujące:
UPDATE (
SELECT
f1.firstfield,
f2.anotherfield,
f2.something
FROM file1 f1
WHERE f1.firstfield like 'BLAH%'
INNER JOIN file2 f2
ON substr(f1.firstfield,10,20) = substr(f2.anotherfield,1,10)
)
AS my_files(firstfield, anotherfield, something)
SET
firstfield = ('BIT OF TEXT' || something)
Edycja: Ian ma rację. Mój pierwszy instynkt polegał na próbie wybrania subselekcji:
UPDATE file1 f1
SET f1.firstfield = ('BIT OF TEXT' || (
SELECT f2.something
FROM file2 f2
WHERE substr(f1.firstfield,10,20) = substr(f2.anotherfield,1,10)
))
WHERE f1.firstfield LIKE 'BLAH%'
AND substr(f1.firstfield,10,20) IN (
SELECT substr(f2.anotherfield,1,10)
FROM file2 f2
)
Ale nie jestem pewien, czy połączenie będzie działało. Zakłada się także, że istnieje mapowanie 1: 1 między podciągami. Jeśli istnieje wiele wierszy, które pasują, to nie zadziała.
Dzięki ConcernedOfTunbridge - niestety tego nie robi praca w DB2, dostaję błąd mówiąc „kwalifikator kolumny lub tabeli B nieokreślone” – Hamish
jakiegokolwiek innego pomysły? – Hamish
wypróbowałeś || zamiast +, i chcesz wpisać sprzężenie wewnętrzne zamiast "join" - myślę, że funkcja substr powinna mieć wartość "10, 10", a nie "10, 20", patrz http://publib.boulder.ibm.com/infocenter/ db2luw/v8/index.jsp? topic =/com.ibm.db2.udb.doc/admin/r0000854.htm –