2014-02-13 38 views
0

我試圖用另一個表(房子)的計數來更新一個表(街道)中的某些記錄。我試圖用街道上正確數量的房屋更新街道表中的house_count。我只想更新不正確的記錄。我已經能夠做到這一點是MSSQL使用下面的代碼:使用來自其他表的計數更新Oracle中的特定行

CREATE TABLE street 
(
name varchar(255), 
house_count int 
); 

Create table house 
(
id varchar(255), 
street_name varchar(255) 
); 

insert into street values ('oak',1) 
insert into street values ('maple',2) 
insert into street values ('birch',4) 
insert into street values ('walnut',1) 

insert into house values (1,'oak') 
insert into house values (2,'oak') 
insert into house values (1,'maple') 
insert into house values (2,'maple') 
insert into house values (1,'birch') 
insert into house values (2,'birch') 
insert into house values (3,'birch') 
insert into house values (1,'walnut') 

update s set s.house_count= hc.ActualCount 
from street s 
inner join 
(select s.name, count(s.name) as 'ActualCount', s.house_count 
from street s 
inner join house h on s.name=h.street_name 
group by s.name, s.house_count 
having count(s.name) <> s.house_count) hc ON s.name=hc.name 
where s.name=hc.name 

我需要在Oracle中做類似的事情,但遇到了問題。從我發現的連接在Oracle中是不可能的,但是我很難得到一些可行的東西。非常感謝在Oracle中獲得這樣的幫助。

感謝

回答

0

您可以使用相關子查詢做到這一點:

update street 
    set house_count = (select count(s.name) 
         from house h 
         where street.name = h.street_name 
        ); 

這是你的做法有點不同,因爲它會更新所有街道,甚至當計數不改變。在試圖阻止更新時使用子查詢沒有性能優勢。

編輯:

這應該與公寓街道與房子街道解決的問題:

update street 
    set house_count = (select count(s.name) 
         from house h 
         where street.name = h.street_name 
        ) 
    where exists (select 1 from house h where street.name = h.street_name); 
+0

謝謝,我正在努力簡化我的例子,使其更容易解釋,但有其他的表在街道表中有記錄。例如一張也參考街道表的公寓表。在我的情況下,房子數量可能是公寓,但房屋和公寓永遠不會在同一條街上。我只關心更新房屋的數量,想單獨離開公寓街道。通過以這種方式運行語句,它將更新所有記錄。有關如何更新不正確的記錄或至少只是房子街道的任何想法? – user3306994

相關問題