2013-02-18 74 views
-1

我有一個問題,創建查詢過濾表

===========  ============================   ================= 
ValueTable1  ValueTable2       FilterTable1  
===========  ============================   ================= 
Id |Name   Id | RefNo || Property| Value  Id|Property|Operator|Value 
1 |X    1  1  P1   500   1 P1  >  100 
        2  1  P2   300   1 P2  =  300 
        3  1  P3   200   1 P3  <>  100 

2 |Y    4  2  P1   250 
        5  2  P2   100 
        6  2  P3   200 

我有2臺ValueTable和1個過濾器表在我的數據庫 我想創建一個查詢,可以從FilterTable1性能和運營商過濾Valuetabl2 我無法創建它。是否有任何方法?

回答

0

也許我誤解你的問題......

你想在表ValueTable2的值上應用FilterTable1上的那些過濾器,對嗎?

做的和條件......與過濾器..

確定哪些引用號填寫的所有條件。我是對的?還是在這一點上誤解了?

和這個RefNo引用表ValueTable1,對吧?或者我誤解了?

如果我undestood權

可以嘗試這樣的事情......

create table ##ValueTable1 (id int , name varchar) 
    insert into ##ValueTable1 
    values (1,'X'),(2,'Y') 

    create table ##ValueTable2 (id int , RefNo int, Property nvarchar(max),value int) 
    insert into ##ValueTable2 
    values 
    (1 , 1 ,'P1',  500), 
    (2 , 1 ,'P2',  300), 
    (3 , 1 ,'P3',  200), 
    (4 , 2 ,'P1',  250), 
    (5 , 2 ,'P2',  100), 
    (6 , 2 ,'P3',  200) 

    create table ##FilterTable1 (id int, Property nvarchar(max),Operator nvarchar(max) , value int) 
    insert into ##FilterTable1 
    values 
    (1,'P1','>', 100), 
    (1,'P2','=', 300), 
    (1,'P3','<>',100) 




    declare @sql nvarchar(max) 
    set @sql = '' 
    select @sql = @sql + ' intersect select RefNo from ##ValueTable2 where Property = ''' +Property+''' and value '+Operator+CAST(value as varchar(max)) 
    from ##FilterTable1 
    where id = 1 
    set @sql = 'select * from ##ValueTable1 T inner join ('+STUFF(@sql,1,10,'') +')V on V.RefNo = T.id' 
    --just stuff @sql if ##ValueTable1 doesnt matter 
    --set @sql = STUFF(@sql,1,10,'') 

    exec(@sql) 


    drop table ##ValueTable2 
    drop table ##FilterTable1 
    drop table ##ValueTable1 

我的ResultSet實現的是...

id name RefNo 
1 X  1 
0

您必須在程序循環中爲您的sql語句創建一個字符串,然後執行它。

請看這裏如何執行它:http://msdn.microsoft.com/de-de/library/ms188332.aspx

您不能直接創建動態sql查詢。

因此,創建一個程序,創建一個本地遊標循環將ValueTable2,並對每個屬性檢查FilterTable1operator,然後創建您再執行新的SQL字符串。

編輯

我不完全理解你的要求,但是這個例子應該給你一個方法:

DECLARE @operator varchar(2) 
DECLARE @value varchar(255) 
DECLARE @sql varchar(max) 

DECLARE cur1 CURSOR FOR 

SELECT [operator], CAST([value] AS varchar(255)) 
FROM ValueTable2 v 
JOIN FilterTable1 f ON v.Property = f.Property 

OPEN cur1 

FETCH NEXT FROM cur1 
INTO @operator, @value 

WHILE @@FETCH_STATUS = 0 
    BEGIN 
    @sql = 'SELECT * FROM ValueTable2 WHERE [value] ' + @operator + ' ' + @value 
    PRINT @sql 
    -- EXEC sp_executesql @sql 
    FETCH NEXT FROM cur1 INTO @operator, @value 
END 

DEALLOCATE cur1 
+0

謝謝您的回答。我知道如何執行它,但我無法創建query.Filter錶行必須是AND子句 – user1624185 2013-02-18 19:31:59

+0

我編輯我的答案,希望這有助於。 – YvesR 2013-02-18 19:43:46

+0

2nd編輯:@value需要是varchar,所以我CAST()值 – YvesR 2013-02-18 19:47:56

0

好吧,我會盡量不使用遊標和/或動態SQL 。遊標可能會產生嚴重的鎖定問題,動態SQL總是被重新編譯,所以在我看來,這樣做是不可行的。

但是,使用具有while循環的臨時表可能會更好,而不是使用遊標。對於邏輯,我會說,它必須能夠使用一些if語句..

我做了這個SQLFiddle(http://sqlfiddle.com/#!3/8a4e3/)向你展示我的意思