2010-05-21 150 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