2017-04-18 32 views
0

使用Oracle PL/SQL是否有下面一組T-SQL語句的簡單等價物?看起來,我發現的所有內容都是無望地過時的,或者填充表格數據類型,沒有解釋如何使用結果,而不是將值寫入標準輸出。Oracle表變量

declare @tempSites table (siteid int) 

insert into @tempSites select siteid from site where state = 'TX' 

if 10 > (select COUNT(*) from @tempSites) 
begin 
    insert into @tempSites select siteid from site where state = 'OK' 
end 

select * from @tempSites ts inner join site on site.siteId = ts.siteId 

由於@AlexPoole在他的評論中指出,這是一個相當人爲的例子。 我試圖做的是獲得符合一定標準的所有網站,如果沒有足夠的匹配,那麼我期待使用一組不同的標準。

+0

如果你正在嘗試做什麼,解釋這個邏輯可能是有用的,因爲這看起來有點令人費解。順便說一句,是'''正確的操作符,還是應該'''?您似乎希望您的站點表中的狀態爲TX的所有列,並且如果這些列中有超過10個,那麼還有所有狀態爲OK的列? –

+0

已更新。示例是實際使用內容的縮短和​​修改版本。 – Joe

回答

1

Oracle沒有本地臨時表,並且全局臨時表在這裏看起來不合適。

你可以使用一個公用表表達式(subquery factoring):

with tempSites (siteId) as (
    select siteid 
    from site 
    where state = 'TX' 
    union all 
    select siteid 
    from site 
    where state = 'OK' 
    and (select count(*) from site where state = 'TX') < 10 
) 
select s.* 
from tempSites ts 
join site s on s.siteid = ts.siteid; 

也就是說不太一樣的東西,但得到所有的TX的ID,並只包括確定的,如果TX者的計數 - 必須重複 - 少於10次。然後,CTE被連接回原始表格,這似乎有點浪費;你打三次同桌。

你可以在過濾器中,而不是直接使用子查詢:

select * 
from site 
where state = 'TX' 
or (state = 'OK' 
    and (select count(*) from site where state = 'TX') < 10); 

但再次TX網站都有被檢索(或者至少計算)第二次。

您可以使用內聯視圖(或CTE,如果您願意)的單擊命令執行此操作,並帶有分析計數 - 這會將TX行的計數添加到實際表中的列中,因此您可以可能要排除最終結果集虛擬列(但使用*是不好的做法,反正):

select * -- but list columns, excluding tx_count 
from (
    select s.*, 
    count(case when state = 'TX' then state end) over (partition by null) as tx_count 
    from site s 
    where s.state in ('TX', 'OK') 
) 
where state = 'TX' 
or (state = 'OK' and tx_count < 10); 

從你的研究的描述聽起來好像你一直在尋找參與PL/SQL代碼是什麼填充一個你仍然可以做的集合,但它可能是過度殺傷的,除非你的真實情況要複雜得多。