2010-07-08 88 views
1

我現在有一個多標準查詢,該過濾器基礎上的ID是一個子查詢NHibernate的多標準CTE子查詢

Subqueries.PropertyIn("Id", detachedCriteria)

子查詢中的結果是在多標準查詢中使用的所有查詢相同。

看起來有點難看的子查詢重複的SQL,在我目前的情況下15次。

單獨查詢的原因是每個人都有不同的連接,並且不希望進行一次大規模的笛卡爾連接。

如果我手寫的sql我會退出經重複子查詢到一個共同的表表達式

WITH XYZ AS 
{ 
    .... 
} 

,然後將子查詢是其中id在XYZ在15個查詢。

這是一個特定於SQL Server的服務器,替代方案是臨時表或其他特定於數據庫的功能。

任何想法如何改善查詢,或者我堅持與子查詢被複制?

回答

1

那麼,如果您要返回多個結果集,那麼使用WITH將無濟於事,因爲它只能應用於單個SELECT聲明。

無論如何,爲了使數據層代碼與數據庫無關,我可能會將實際的查詢邏輯推送到存儲過程中。這意味着您可以使用特定於引擎的功能前往城鎮,因爲它全部隱藏在公共界面之後。是的,您必須重新實現您支持的每個數據庫引擎的查詢(通常很少),但是您可以完全控制每個引擎上運行的內容,並且您的數據訪問代碼將會變得非常乾淨。

+0

感謝您的信息,閱讀您的建議後發現此文章確認您的評論。 http://www.singingeels.com/Articles/Understanding_SQL_Complex_Queries.aspx「有一點需要注意的是CTE只能在查詢中使用一次,所以你不能在最上面聲明你的CTE,然後做多個查詢但是,您可以創建多個CTE,然後在一個查詢中一起使用它們,並且所有事情都有它的位置,所以如果您發現多次爲不同的報告/查詢構建相同的CTE,那麼您可能需要轉向而不是進入VIEW。「 – Ian 2010-11-15 09:08:05

+0

在我的情況下,我無法像創建動態查詢那樣創建存儲過程。爲每個動態查詢創建一個視圖將會變得更慢,吞噬事務日誌(可以使用簡單的恢復模式放入另一個鏈接的數據庫)。無論如何,CTE不會幫助我。 – Ian 2010-11-15 09:15:11

+0

@Ian:您*可以*使用存儲過程。只需傳遞你在NHibernate查詢中使用的所有輸入參數即可。如果它有很多參數或事物列表(例如,ID),則可以考慮將參數作爲XML傳遞。 – 2010-11-15 17:49:20