2010-05-21 151 views
0

我有一張表(與多個其他表相關),我想過濾其中一列(RequesterID) - 該列將是一個組合框,其中只有非銷售人員可以選擇。如何過濾SQL Server SQL查詢中的某一列

這裏是「未過濾」查詢時,讓調用它QUERY 1:

SELECT RequestsID, RequesterID, ProductsID 
FROM dbo.Requests 

如果使用一個單獨的查詢,讓稱之爲QUERY 2,過濾RequesterID(其是相關列中的人物,連接到People.PeopleID),它是這樣的:

SELECT  People.PeopleID 
FROM   People INNER JOIN 
        Roles ON People.RolesID = Roles.RolesID INNER JOIN 
        Requests ON People.PeopleID = Requests.RequesterID 
WHERE  (Roles.Role <> N'SalesGuy') 
ORDER BY Requests.RequestsID 

現在,有「合併」,查詢到2查詢1的方法嗎?

(詢問1 dbo.Requests已RequesterID人口從dbo.People外鍵,所以有沒有問題......這些連接都沒事,只是不知道怎麼寫SQL查詢!)

UPDATE

試圖解釋什麼,我的意思是在多一點...:

結果集應該是多個請求 - 和請求的數量不應該由QUERY 2限制QUERY 2:唯一的功能是限制可選子集列Requests.RequesterID - 不,這不是很清楚,但在C#VS2008實現中,我使用Requests.RequesterID最終使用[全名](它是People表中的另一列)填充ComboBox,並在那一欄我不想讓SalesGuy儘可能地顯示出來;這裏我正嘗試清除它更...(但有錯誤的語法,當然)

SELECT RequestsID, (RequesterID WHERE RequesterID != 8), ProductsID 
FROM dbo.Requests 

是,RequesterID 8恰好是SalesGuy :-)

+0

你是什麼意思合併? – 2010-05-21 11:21:42

+0

我的意思是填充我想要的peopleid的名單,以某種方式查詢2應該能夠與查詢1在一個單一的查詢一起工作 - 合併是也許不是最好的詞,但我不知道如何把它其實 - 我希望這可以爲你清除。 – 2010-05-21 11:49:14

+0

我已經更新了我的答案。逐漸回暖? – 2010-05-21 12:16:29

回答

1

這裏是如何處理這個話題非常全面的文章:

Dynamic Search Conditions in T-SQL by Erland Sommarskog

它涵蓋了所有的問題和努力的T方法o用多個可選搜索條件編寫查詢。你需要關心的主要事情不是代碼的重複,而是使用索引。如果你的查詢不能使用索引,它會變形很差。有幾種可以使用的技術,可以使用也可以不使用索引。

這裏是表的內容:

 
    Introduction 
     The Case Study: Searching Orders 
     The Northgale Database 
    Dynamic SQL 
     Introduction 
     Using sp_executesql 
     Using the CLR 
     Using EXEC() 
     When Caching Is Not Really What You Want 
    Static SQL 
     Introduction 
     x = @x OR @x IS NULL 
     Using IF statements 
     Umachandar's Bag of Tricks 
     Using Temp Tables 
     x = @x AND @x IS NOT NULL 
     Handling Complex Conditions 
    Hybrid Solutions – Using both Static and Dynamic SQL 
     Using Views 
     Using Inline Table Functions 
    Conclusion 
    Feedback and Acknowledgements 
    Revision History

,如果你在SQL Server 2008中的正確的版本,有可以使用的另一種技術,請參閱:Dynamic Search Conditions in T-SQL Version for SQL 2008 (SP1 CU5 and later)

如果你是在適當版本的SQL Server 2008上,您可以將OPTION (RECOMPILE)添加到查詢中,並將運行時本地變量的值用於優化。

考慮這一點,OPTION (RECOMPILE)將以此代碼(其中沒有索引可以與這種混亂的OR s內使用):

​​

並在運行時優化它被(前提是僅@搜索2傳遞與值):

WHERE 
    [email protected] 

和索引都可以使用(如果您已經在列2中定義一個)

1

這個怎麼樣?由於查詢的請求表已經連接,你可以列簡單地添加到選擇列表,像這樣:

SELECT  Requests.RequestsID, Requests.RequesterID, Requests.ProductsID 
FROM   People INNER JOIN 
        Roles ON People.RolesID = Roles.RolesID INNER JOIN 
        Requests ON People.PeopleID = Requests.RequesterID 
WHERE  (Roles.Role <> N'SalesGuy') 
ORDER BY Requests.RequestsID 

可以實際上從任何連接表(角色,要求,人民的選擇任何列,等)

,如果你只是更換* People.PeopleId,它會告訴你從表中檢索到的一切都變得清晰。

+1

我也這麼認爲。儘管如此,我仍然不確定這個要求是否已經閱讀了大約3次的問題!我看不到任何動態列要求,但可能缺少一些東西。 – 2010-05-21 11:48:13

+0

'SELECT *'是一種不好的做法。它會浪費資源返回未使用的列,並且阻止使用覆蓋索引。 @Martain Smith,我也不太確定OP通過'merge'意味着什麼,結果集應該是什麼?如何過濾?等等。 – 2010-05-21 11:53:59

+0

結果集應該是許多請求 - 而且請求數量不應該受限於QUERY 2. QUERY 2:唯一的功能是限制列Requests.RequesterID中的可選子集 - 不,它是不是很清楚,但在C#VS2008實現中,我使用Requests.RequesterID最終用[Full name]填充ComboBox,這是People表中的另一列... – 2010-05-21 12:09:57