2016-11-09 4 views
0

私は条件が真である場合は、1つのテーブルに複数のテーブルに挿入する、すなわちこのSQL Serverカーソルをセットベースの速度に変換する方法は?

Person 

tableID  PersonUniqueNumber 
1    123 
2    1234 
3    121 
4    12 
5    113333 

と別のテーブル

RentedHousesDetail 

HouseId(tableId)  HouseName   HouseLocation ISOK 
    1      A     CA   NO 
    2      B     DT   NULL 
    3      C     NY   NULL 
    4      D     CA   
    5      E     CA 

と他のテーブル

表 CALIFORNIAHOUSEを持っています

一人一人のために、私はRentedHousesDetailの彼houselocationがCAであるかどうかを確認するために持っているので、私は何をしなければならないことは、私は、テーブルCALIFORNIAHOUSEとSTATUSGREENにRentedHousesDetail.IDの単一の行の挿入を行うために

表 STATUSGREEN

を持っているし、 RentedHousesDetail.ISOK列をNOに更新します。

テーブルには何千もの行があるので、私はカーソルを書きました。

DECLARE variables 

DECLARE cursorName CURSOR -- Declare cursor 

LOCAL SCROLL STATIC 

FOR 

select PERSON.ID of those rows only where we have CA in RentedhouseDetails 

OPEN cursorName -- open the cursor 

FETCH NEXT FROM cursorName 
INTO variables 

WHILE @@FETCH_STATUS = 0 

BEGIN 

    FETCH NEXT FROM cursorName 

    FOR EACH ROW that we have from cursor, insert into CALIFORNIAHOUSE and STATUSGREEN and update RentedHousesDetail.ISOK to NO 

END 

CLOSE cursorName -- close the cursor 

DEALLOCATE cursor 

それは人とRentedhousedetailsテーブル内の行の数千人の上にカーソルを使用しても大丈夫です教えてください?どのように私は速度のセットベースの操作に変換することができますか?

+0

のように 'NO'

として表RentedHousesDetailどこHouseLocation = 'CA' を更新しますか私はそれらの間に何の関係も見ませんでした。 –

答えて

2

ここでカーソルを使用する必要はありません。 最初にあなたは、この

Insert into CALIFORNIAHOUSE 
select p.id from Person p JOIN RentedHousesDetail r ON p.ID=r.ID 
where r.HouseLocation='CA' 
同様CALIFORNIAHOUSEとSTATUSGREENテーブル

にすべてのそのレコードを挿入し、我々は

select p.id from Person p JOIN RentedHousesDetail r ON p.ID=r.ID 
where r.HouseLocation='CA' 

ようRentedhouseDetails でCAを持つ行のみのPERSON.IDを選択する必要があります

および

Insert into STATUSGREEN 
select p.id from Person p JOIN RentedHousesDetail r ON p.ID=r.ID 
where r.HouseLocation='CA' 

そして最終的には人とrentedhousedetailsとの間の接続は何ですか?この

update RentedHousesDetail set ISOK='NO' from Person p JOIN RentedHousesDetail r ON p.ID=r.ID 
where r.HouseLocation='CA' 
1

一時テーブルを使用すると非常に簡単です。これにカーソルを使用する理由はなく、次のパフォーマンスはカーソルベースのソリューションを上回るはずです。

擬似コードの空白は、明らかに記入する必要があります。

Create Table #PersonIDs (PersonID int Not Null Primary Key Clustered); 

Insert Into #PersonIDs 
Select Person.ID --- of those rows only where we have CA in RentedHouseDetails 

Insert Into CALIFORNIAHOUSE 
Select PersonID From #PersonIDs; 

Insert Into STATUSGREEN 
Select PersonID From #PersonIDs; 

Update rhd 
    Set ISOK = 'No' 
    From RentedHousesDetail As rhd 
    Join #PersonIDs On rhd.PersonID = #PersonIDs.PersonID; 

Drop Table #PersonIDs; 
関連する問題