2015-01-20 100 views
0

比方說,我有一個表填寫與一列數據一列幾何和另一個表客戶這樣的:另一個表(隨機)

幾何         客戶
城市              ID    位置
----               -       --------
柏林             (空)
巴黎             (null)
倫敦

現在我想填寫位置從列城市的數據。 「隨機」會很好,但根本不重要。

我已經試過

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

,但仍然收到此錯誤:single-row subquery returns more than one row

更新:我想補全列位置一個更新聲明。我正在使用ORACLE。結果應該是這樣的:

客戶
ID      位置
-         -------
     柏林
     倫敦

有人有更好的主意嗎?

非常感謝!

+0

其超過一排,因爲不止一個結果滿足您的條件兩個相等的隨機值。 <3表示1和2表示您將有多於1個結果 – 2015-01-20 23:59:05

回答

0

SQL服務器:

UPDATE 
    Customer 
SET 
    Location = (SELECT TOP 1 City FROM Geometry ORDER BY NEWID()); 
+0

非常感謝您,但它對我無效。我也編輯了我的問題。 – 2015-01-21 02:24:46

0

既然你只是希望它挑一條記錄在「隨機」,你需要指定正確的行數:

update Customer set Location = (select City from Geometry where rownum = 1); 

但需要注意的是,由於子查詢根本不與Customer相關聯,子查詢可能會優化爲只運行一次,而相同(隨機選擇的)City可能會用於更新所有Location

+0

所以就像你說的同一個城市(在我的例子中它總是柏林)將被用來更新所有地點。你能看看我編輯的問題嗎?非常感謝你。 – 2015-01-21 02:27:55

+0

你說「隨機」會很好,但根本不重要。「所以按照這個邏輯,把它們全部設置到一個城市(例如柏林)是很好的。否則,您需要指定用於爲每個客戶選擇城市的邏輯。 – 2015-01-21 02:37:40

+0

另一種方法(性能不佳)是創建一個函數,隨機返回一個城市,並在'set'子句中調用該函數。只要該函數沒有嵌入到靜態查詢中,它將針對每個客戶單獨調用。 – 2015-01-21 02:39:13

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'; 

這將匹配的,「隨機」位置更新customers表。當記錄是INSERT編輯爲customers - 只要要插入的位置是'X'或NULL,觸發器也會產生一個新的「隨機」位置。 (如果你實際上有一個位置X - 這裏插入一些其他的值,這將不是明智之舉)

編寫一個存儲過程來做同樣的事情是非常可能的,但是你必須創建一個遊標循環遍歷customers的所有行,其中locationNULL

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); 

distinct必要的,如果有一個ID