Sql 使用返回多个值的函数更新多个列
我试图用函数的多个返回值更新一个表 我已经创建了一个类型Sql 使用返回多个值的函数更新多个列,sql,oracle,Sql,Oracle,我试图用函数的多个返回值更新一个表 我已经创建了一个类型 CREATE OR REPLACE TYPE city_state AS OBJECT ( city VARCHAR2(30), state VARCHAR2(2) ); / 我有一个函数,返回这种类型的变量 CREATE OR REPLACE FUNCTION closestcity(lat IN NUMBER, lon IN NUMBER) RETURN city_state IS ... 我需要更新一个包含城市、州、纬度
CREATE OR REPLACE TYPE city_state AS OBJECT
(
city VARCHAR2(30),
state VARCHAR2(2)
);
/
我有一个函数,返回这种类型的变量
CREATE OR REPLACE FUNCTION closestcity(lat IN NUMBER, lon IN NUMBER) RETURN city_state IS
...
我需要更新一个包含城市、州、纬度和经度列的表。对于lat/lon,我应该调用函数并使用结果更新城市/州的值。我只想为每一行调用一次函数,并且只有一些行需要更新(假设city为NULL)
这就是我目前得到的
UPDATE (SELECT * FROM t t1 WHERE city IS NULL)
SET (city, state) = (
SELECT newcity.city, newcity.state FROM
( SELECT closestcity(latitude, longitude) newcity
FROM t t2
WHERE t1.latitude = t2.latitude AND
t1.longitude = t2.longitude)
);
但我得到一个无效的标识符错误。我觉得我把它复杂化了,正确的方法是什么?语法应该是:
UPDATE <table1>
set (<column1>, <column2>) = (select <column1>,<column2>
from <table2>
where <where clause table2 > )
where <where clause table1>
UPDATE t1
SET (city, state) = (SELECT closestcity(latitude, longitude) newcity
,state
FROM t t2
WHERE t1.latitude = t2.latitude
AND t1.longitude = t2.longitude)
where city IS NULL
出现该错误的原因是Oracle试图限定
SELECT newcity.city,newcity.state
SELECT语句中引用的newcity
。它找不到对象newcity
,因此抛出错误。如果确实需要,还可以将内联视图别名为t1
。作为@Rene,您可以成功地将其替换为表名。为此,您可以按如下方式重写update语句:
UPDATE (SELECT * FROM t t1 WHERE city IS NULL) t1
SET (city, state) = (
SELECT closestcity(latitude, longitude).city
, closestcity(latitude, longitude).state
FROM t t2
WHERE t1.latitude = t2.latitude
AND t1.longitude = t2.longitude
);
或者简单地说:
UPDATE t t1
SET city = closestcity(latitude, longitude).city
, state = closestcity(latitude, longitude).state
where t1.city is null
更新#1
update (select nd.newdata.city as newcity
, nd.newdata.state as newstate
, city
, state
from (
SELECT closestcity(latitude, longitude) newdata
, city
, state
FROM t
where city is null
) nd
) q
set q.city = q.newcity
, q.state = q.newstate
只要一个变化
UPDATE (SELECT * FROM t WHERE city IS NULL) **t1**
SET (city, state) = (
SELECT newcity.city, newcity.state FROM
( SELECT closestcity(latitude, longitude) newcity
FROM t t2
WHERE t1.latitude = t2.latitude AND
t1.longitude = t2.longitude)
);
我得到了
ORA-00904:“T1”。“经度”:无效标识符
这是可行的,但我最终调用了closestcity两次-这是一个非常重的函数State是newcity的一个变量(就像city一样),我无法直接选择它