使用另一个表中一列的数据填充一列(随机)

时间:2015-01-20 23:49:19

标签: sql oracle

我们说我有一个表 Geometry 和另一个表 Customer ,如下所示:

几何 客户
城市ID位置
---- - --------
柏林1(null)
巴黎2(null)
伦敦

现在,我想使用 City 列中的数据填充位置列。 "随机"会很好,但它根本不重要。

我已经尝试了



update Customer set Location = (select City from Geometry where rownum < 3);
&#13;
&#13;
&#13;

但仍然收到此错误:single-row subquery returns more than one row

更新:我想用一个更新语句填充整个列位置。我正在使用ORACLE。结果应如下所示:

客户
ID位置
- -------
1柏林
2伦敦

有人有更好的主意吗?

非常感谢!

4 个答案:

答案 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