1

私は顧客の統計データのソリューションを開発していますが、別のテーブル(顧客によって入力され、毎日変更される可能性があります)からの動的条件を使用して、いくつかの行from a table販売データ)を選択する必要があります。

また、カーソルを使用してさらに計算やその他の処理を実行する必要があるため、これがシナリオです。

DECLARE cRiga CURSOR LOCAL FAST_FORWARD FOR
    -- here i will put the SELECT ...
OPEN cRiga
    FETCH NEXT FROM cRiga INTO @field1, @field2, @field3, ...
    WHILE @@FETCH_STATUS = 0
    BEGIN
        -- do some stuff here ...
        FETCH NEXT FROM cRiga INTO @field1, @field2, @field3, ...
    END
CLOSE cRiga
DEALLOCATE cRiga

これは、動的条件を見つけることができる条件テーブルです(列Completa = 0を参照)

IDIncentive CdMarca CdSettore CdGruppo Completa
----------- ------- --------- -------- -----------
1           COES    NULL      NULL     1
1           DELONG  10        0024     0  <
1           RHOSS   NULL      NULL     1
1           SILE    10        0012     0  <
1           SILE    11        0025     0  <
1           THERMI  NULL      NULL     1
....... more rows ...

より明確にするために、私は多くのクエリで必要なSQLを次のように分解しようとしています。

Select Field1, ... from SELLDATA 
where IDIncentive=1 and CdMarca='DELONG' and CdSettore=10 and CdGruppo='0024'
UNION ALL
Select Field1, ... from SELLDATA 
where IDIncentive=1 and CdMarca='SILE' and CdSettore=10 and CdGruppo='0012'
UNION ALL
Select Field1, ... from SELLDATA 
where IDIncentive=1 and CdMarca='SILE' and CdSettore=11 and CdGruppo='0025'

あなたが想像できるように、私はそれをすることができません。なぜなら、条件は顧客によって毎日変わるので、私の質問は:

カーソルで使用するすべての条件(上記の例のように)を持つ選択を作成するにはどうすればよいですか?方法はありますか?

私を助けてくれる人に感謝し、この質問をより明確にするためにさらに情報が必要な場合はアドバイスしてください

4

3 に答える 3

2

実際にカーソルが必要であると仮定すると(10回のうち9回は必要ありません)、動的SQLとsp_executesqlを使用して、実行時に任意のカーソルを作成できます。

declare @cursor cursor
declare @sql nvarchar(max)
declare @dynamic_part nvarchar(max)
declare @name sysname

set @dynamic_part = 'tables'
set @sql = '
  set @cursor = cursor static for select top (100) name from sys.'+@dynamic_part+'
  open @cursor'

exec sp_executesql @sql, N'@cursor cursor output', @cursor output 
while 1=1 begin
  fetch next from @cursor into @name
  if @@fetch_status <> 0 break
  print @name
end
close @cursor deallocate @cursor

または、一時テーブルを作成し、動的SQLを介して一時テーブルにデータを入力してから、一時テーブルに対してカーソルを定義することもできます。

declare @cursor cursor
declare @sql nvarchar(max)
declare @dynamic_part nvarchar(max)
declare @name sysname

if object_id('tempdb..#these_things') is not null drop table #these_things
create table #these_things (name sysname)

set @dynamic_part = 'tables'
set @sql = 'insert #these_things (name) select top (100) name from sys.'+@dynamic_part
exec (@sql)

set @cursor = cursor fast_forward for select name from #these_things
open @cursor
while 1=1 begin
  fetch next from @cursor into @name
  if @@fetch_status <> 0 break
  print @name
end
close @cursor deallocate @cursor

これはおそらく少しきれいです。

于 2012-06-01T14:12:46.680 に答える
1

既存のConditionTableテーブルを使用して、join(カーソルなし、union allなし)を使用してSELLDATAをフィルタリングできます。

Select Field1, ... 
  from SELLDATA 
 inner join ConditionTable
    ON SELLDATA.IDIncentive=ConditionTable.IDIncentive 
   and SELLDATA.CdMarca=ConditionTable.CdMarca
   and SELLDATA.CdSettore=ConditionTable.CdSettore
   and SELLDATA.CdGruppo=ConditionTable.CdGruppo
 where ConditionTable.Completa = 0
于 2012-06-01T14:23:58.833 に答える
0

サブクエリが役立つと思います。

http://dev.mysql.com/doc/refman/5.1/en/subqueries.html

于 2012-06-01T13:51:37.283 に答える