我碰到過這樣一個場景,我需要在交叉點從「傳統」到返回一組複雜的計算值的電流。SQL Case語句,在條件使子選擇?
爲了削減長話短說我有這樣的事情......
with someofit as
(
select id, col1, col2, col3 from table1
)
select someofit.*,
case when id < @lastLegacyId then
(select ... from table2 where something = id) as 'bla'
,(select ... from table2 where something = id) as 'foo'
,(select ... from table2 where something = id) as 'bar'
else
(select ... from table3 where something = id) as 'bla'
,(select ... from table3 where something = id) as 'foo'
,(select ... from table3 where something = id) as 'bar'
end
from someofit
這裏沒有謊言,我不希望經常做着這種情況下,檢查每個子選擇的問題... 但在適用該條件的同時,我需要在相關案例塊中的所有選擇。
有沒有一種更聰明的辦法做到這一點?
如果我是在我會用這樣的一個適當的面向對象的語言......
var common = GetCommonSuff()
foreach (object item in common)
{
if(item.id <= lastLegacyId)
{
AppendLegacyValuesTo(item);
}
else
{
AppendCurrentValuesTo(item);
}
}
我也開始嘗試做2點完整的選擇與UNION ALL但這並不對因工作得很好效率/要評估的行數。
子選項都在尋找其中的一些條件比ID匹配滿足其他在任表2或3,但這些表可能有上百萬行的總他們的行數。
熱膨脹係數是用於2個原因...
首先它拉只從表1中我很感興趣,所以馬上我只是做在每種情況下的子選項的一小部分行。
其次,其返回的共同的東西,在一個單一的查找表1
任何想法?
編輯1:
一些背景的情況......
我有一個表稱爲「進口」(上表1),這代表着我們從文件中的數據導入作業(CSV或類似的)並將記錄拉入數據庫。
然後我有一個叫做「臺階」表,這代表我們通過去處理/清洗規則,每個記錄包含一個存儲過程的名稱和有關規則的一堆其他的東西。
然後有一個連接表,它表示對特定導入「ImportSteps」規則(上文表2 - 對於當前數據),這包含了「的RowsAffected」列和進口ID
所以對於當前工作我SQL是很簡單...
選擇進口 加入了舊的遺留東西importsteps
但是我不得不通過看錶3 123 456 ...表3是保持臺,它包含每個導入的記錄,每行都有一個導入ID和每行包含關鍵值。
上的RowsAffected上表2進口ID x其中一步ID爲y將返回我的價值,新的數據。
對遺留數據我在拿着其中山坳Z =東西我需要在大約20個進口數據,並將這些數據綁定到我的MVC Web應用程序是「數據網格」(如果要算上行
有什麼區別)
我使用的cte通過一些參數決定了「當前20 im感興趣」這些參數代表開始和結束記錄(按導入id排序)。
我最大的問題是,控股表...它是巨大的..單個作業已知它們自己包含500k +記錄,此表保存多年導入的行,所以我需要在該表上查找我的儘可能快,儘可能少。
編輯2:
實際的解決方案(只suedo代碼)...
-- declare and populate the subset to reduce reads on the big holding table
declare table @holding (...)
insert into @holding
select .. from holding
select
... common stuff from inner select in "from" below
... bunch of ...
case when id < @legacy then (select getNewValue(id, stepid))
else (select x from @holding where id = ID and ...) end as 'bla'
from
(
select ROW_NUMBER() over (order by importid desc) as 'RowNum'
, ...
) as I
-- this bit handles the paging
where RowNum >= @StartIndex
and RowNum < @EndIndex
我仍然相信我可以更清潔了,但我原來的查詢,看起來像賬單解決方案在執行時間約爲45秒,這是大約7
這可能會對當前的數據工作,但我不知道舊的遺留物...已經說過...讓我更新問題有點 – War
也可能值得注意的是,ID是主鍵 – War
啊謝謝...這使得更多的敏感e ...我的困難是我的弱sql知識水平...我對我的C#/ linq類型查詢更有信心。 – War