-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

たとえば、プロシージャループでSQLステートメントの文字列を作成し、それを実行する必要があります。

実行方法については、http://msdn.microsoft.com/de-de/library/ms188332.aspxを参照してください。

動的SQLクエリを直接作成することはできません。

したがって、プロシージャを作成し、ローカルカーソルを作成してループし、ValueTable2プロパティごとにチェックインしてoperatorから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

まあ、私はカーソルや動的SQLを使用しないようにします。カーソルは深刻なロックの問題を引き起こす可能性があり、動的SQLは常に(再)コンパイルされているので、一緒にそれを行うことは私の観点ではダメです。

ただし、カーソルの代わりにwhileループを含む一時テーブルを使用する方がよい場合があります。ロジックの場合、ifステートメントを使用できる必要があると思います。

私はこのSQLFiddle(http://sqlfiddle.com/#!3/8a4e3/)を作成して、私が何を意味するかを示しました。

于 2013-02-18T19:54:06.057 に答える
0

多分私はあなたの質問を誤解しました...

これらのフィルターをFilterTable1のテーブルValueTable2の値に適用しますか?

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 に答える