Microsoft SQL查询多个条件

时间:2016-10-21 03:37:01

标签: sql performance

我有一个Attributes表,它有一组由唯一编号标识的属性,然后是它们的描述 - 示例模式是

ID - AttributeName

下面有一些样本数据

1 = FirstName
2 = LastName
3 = Phone

然后我有一个雇员表,为简单起见,该表有以下方案

ID - PersonID
AttribueID - INT Foreign key to the above attributes table

我需要创建一个存储过程,给定条件将根据以下条件之一返回记录

如果我将1传递给存储过程,则proc应返回Person表中与属性ID 1匹配的所有记录(名字) 如果我将2传递给存储过程,则proc应该返回Person表中的所有记录,其中* DO * *不匹配属性ID 1(名字) 如果我将3传递给存储过程,则proc应返回Person表中的所有记录

我可以做以下事情,但觉得这不是最好的方式

DECLARE @IntID INT = 1 -- Set as 1 just for exmple

IF @IntID =1
BEGIN

    SELECT * FROM Person where AttributeID IN (SELECT ID from Attributes Where ID =1) -- match on attribute 1
END
ELSE IF @IntID = 2
BEGIN
    SELECT * FROM Person where AttributeID NOT IN (SELECT ID from Attributes Where ID =1) -- do not match on attribute 1

END
ELSE
BEGIN
    SELECT * FROM Person where AttributeID IN (SELECT ID from Attributes) -- return match on all attributes
END

上面的例子有一个非常简单的SELECT语句 - 在真正的SQL中有一个更大的集合

提前致谢

1 个答案:

答案 0 :(得分:0)

如果您不想使用动态SQL,那么您可以试试这个。而且您的查询太简单了,对于性能优化,您可能会查看表索引。

DECLARE @IntID INT = 1 -- Set as 1 just for exmple

IF @IntID = 1 OR @IntID = 2
BEGIN

    SELECT A.* 
    FROM Person A
    LEFT JOIN Attributes B ON A.AttributeID = B.ID AND B.ID = 1
    WHERE 
    A.AttributeID IS CASE @IntID WHEN 1 THEN NOT NULL WHEN 2 THEN NULL END 
END
ELSE
BEGIN
    SELECT A.* 
    FROM Person A
    INNER JOIN Attributes B ON A.AttributeID = B.ID
END
相关问题