我们说我有一个表 Geometry 和另一个表 Customer ,如下所示:
几何 客户
城市ID位置
---- - --------
柏林1(null)
巴黎2(null)
伦敦
现在,我想使用 City 列中的数据填充位置列。 "随机"会很好,但它根本不重要。
我已经尝试了
update Customer set Location = (select City from Geometry where rownum < 3);
&#13;
但仍然收到此错误:single-row subquery returns more than one row
更新:我想用一个更新语句填充整个列位置。我正在使用ORACLE。结果应如下所示:
客户
ID位置
- -------
1柏林
2伦敦
有人有更好的主意吗?
非常感谢!
答案 0 :(得分:0)
SQL Server:
UPDATE
Customer
SET
Location = (SELECT TOP 1 City FROM Geometry ORDER BY NEWID());
答案 1 :(得分:0)
由于您只是希望它以“随机”方式选择一条记录,您需要指定正确的行数:
update Customer set Location = (select City from Geometry where rownum = 1);
但请注意,由于子查询根本不与Customer
相关联,因此子查询可以优化为仅运行一次,并且相同(随机选择)City
可能会用于更新所有Location
s。
答案 2 :(得分:0)
我会执行以下操作,在customer
上创建一个触发器:
CREATE OR REPLACE TRIGGER customer_location
BEFORE INSERT OR UPDATE OF location ON customer
FOR EACH ROW
WHEN (NVL(new.location, 'X') = 'X')
BEGIN
SELECT city INTO :new.location
FROM (
SELECT city FROM geometry
ORDER BY DBMS_RANDOM.VALUE
) WHERE rownum = 1;
END;
/
UPDATE customer SET location = 'X';
这将使用匹配的&#34;随机&#34;更新customers
表。地点。触发器还会产生一个新的&#34;随机&#34;记录INSERT
加入customers
时的位置 - 只要要插入的位置为&#39; X&#39;或NULL
。 (如果您确实有一个位置X
,那么这不是明智之举 - 在那里插入一些其他值!)
编写存储过程很可能做同样的事情,但你必须创建一个游标来遍历customers
location
NULL
所有行{{1}}
答案 3 :(得分:0)
update customer set location =
(select city from (
select distinct c.id, g.city, dbms_random.value from customer c, geometry g
order by value, city, id
) randoms where randoms.id = customer.id and rownum=1);
如果一个id 有两个相等的随机值,则需要 distinct