2016-10-21 98 views
0

我有具有一組由唯一的編號標識,然後,接着對它們的描述屬性的屬性表 - 一個例子的模式是微軟SQL查詢的多個條件

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表中的所有記錄*不匹配屬性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有一個更大的提前

回答

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 
+0

將多個案例組合成單個通用選擇會導致次優執行計劃,我通常會建議避免這種情況。 –