-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 我无法创建它。有什么办法吗?

4

3 回答 3

0

好吧,我会尽量不使用 CURSORS 和/或动态 SQL。游标可能会产生严重的锁定问题,并且动态 SQL 总是被(重新)编译,所以在我看来,一起这样做是不行的。

但是,使用带有 while 循环的临时表可能比游标更好。对于逻辑,我会说必须可以使用一些 if 语句..

我做了这个 SQLFiddle ( http://sqlfiddle.com/#!3/8a4e3/ ) 来告诉你我的意思

于 2013-02-18T19:54:06.057 回答
0

例如,您必须在过程循环中为您的 sql 语句创建一个字符串,然后执行它。

请参阅此处如何执行它:http: //msdn.microsoft.com/de-de/library/ms188332.aspx

您不能直接创建动态 sql 查询。

因此,创建一个过程,创建一个本地游标以循环到您ValueTable2的每个属性并检查operatorin FilterTable1,然后创建一个新的 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
于 2013-02-18T19:28:48.890 回答
0

也许我确实误解了你的问题......

您想对表 ValueTable2 的值应用 FilterTable1 上的那些过滤器,对吗?

用过滤器做 AND 条件......

确定什么 RefNo 填写所有条件..我是对的吗?还是在这一点上误解了?

这个 RefNo 引用了表 ValueTable1,对吧?还是我误会了??

如果我做错了

可以试试这样的...

    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

我的结果集是......

id  name    RefNo
1   X       1
于 2013-02-18T20:34:24.923 回答