2012-08-31 57 views
1
select b.b_id from btable b inner join atable a on b.b_id = a_id 
go 
delete from btable where b_id in (...) 
go 
insert into btable select * from atable where a_id in (...) 
go 

第二個和第三個SQL語句的條件是第一個SQL查詢結果,有什麼辦法來合併這三個SQL語句轉換成單獨的SQL語句

現在我要合併這三個SQL語句轉換成單sql語句,

有什麼辦法嗎?

+0

@eggyal你的意思是「去」語句分隔符?這完全是關於我使用go的數據庫管理客戶端。 – KindleBaby

回答

2

不,這是不可能的。 PS:所有3個子句在一個語句中幾乎不會被稱爲「查詢優化」。優化是指在提高查詢性能時,而不是在只有N個查詢並將它們置於單個查詢中時。

實際上這是新手之間常見的誤解 - 自動查詢的次數越少意味着執行速度越快。這只是錯誤的。您應該擁有儘可能多的查詢來檢索所有必要的數據,而不是更少。

+0

OP是否有可能要求交易查詢? –

+0

@Adrian康沃爾:我看到'查詢優化'標籤 – zerkms

+0

可能是 - 他們想要在交易中將它們結合起來的直覺 - 誰知道:-) –

2

的問題是爲什麼 - 如果他們都必須按順序執行,那麼你可以將它們分組爲一個事務,如果他們是相關的 - 但是這將取決於你的表引擎

這將要求所有三個如果他們是一個交易,就會工作

另外,在交易,你可以測試一個SQL命令的結果,並決定,如果你想/需要繼續它

+0

「另外在一個事務中,你可以測試一個sql命令的結果,並決定是否需要/需要繼續它」---我從來沒有在我的練習中看到過。嚴格執行sql命令的執行結果。你可以在編程步驟中知道它,所以沒有理由在運行時做這件事。 – zerkms

+0

@zerkms你應該能夠確定結果是一個SP。但我在發出提示 –

+0

時發出單個命令時更加難以接受,原因很簡單:我有許多「三個sql語句」,使用「單個語句」會很明顯。 – KindleBaby

1

我相信,合併將是不可能的,但你可以做的是,把初始結果集放入臨時表並重用它。

CREATE TEMPORARY TABLE tbl (b_id int) 

select b.b_id into tbl from btable b inner join atable a on b.b_id = a_id 

delete from btable where b_id in (select b_id from tbl) 

insert into btable select * from atable where a_id in (select b_id from tbl) 

drop table tbl 

我希望這會給你一些想法開始。