2013-02-18 5 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 таблицы встроенного языка и таблица 1 фильтра в моей базе данных Я хочу создать запрос, который может фильтровать Valuetabl2 от свойств и операторов в FilterTable1 Я не смог создать it.Is там в любом случае?

ответ

0

Может быть, я неправильно понял ваш вопрос ...

Вы хотите применить эти фильтры в FilterTable1 к значениям таблицы ValueTable2, правильно?

делать и состояние ... с фильтрами ..

, чтобы определить, что заполнить все Код ссылки условия .. я прав? или неправильно понял в этот момент?

и этот 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 и для каждого свойства проверить operator в FilterTable1, а затем создать новую строку SQL которую вы выполнить то.

EDIT

Я не в полной мере понять ваши требования, но этот пример должен дать вам такой подход:

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

+0

Я отредактировал свой ответ, надеюсь, что это поможет. – YvesR

+0

2nd edit: @value должен быть varchar, поэтому я CAST() значение – YvesR

0

Ну, я хотел бы попробовать не использовать курсоры и/или динамического SQL , Курсоры могут создавать серьезные проблемы с блокировкой, а динамический SQL всегда (re) скомпилирован, поэтому делать это вместе не стоит в моей точке зрения.

Однако, используя временную таблицу с циклом while, возможно, лучше вместо курсоров. Для логики я бы сказал, что должно быть возможным использовать некоторые если заявления ..

Я сделал это SQLFiddle (http://sqlfiddle.com/#!3/8a4e3/), чтобы показать вам, что я имею в виду

Смежные вопросы