1

最初に 2 つの一時テーブルを作成するクエリがあり、DB 内の既存のテーブルをクエリして、このテーブルをサブクエリに結合し、最後に一時テーブルの 1 つに結合します。これを行うと、既存のテーブルから結合しているキーをバインドできないというエラーが表示されます。奇妙なのは、サブクエリへのすべての参照を取り出し、クエリだけを既存のテーブルとそれが正常に結合する一時テーブルに残すと、既存のテーブルをサブクエリだけに結合すると、正常に機能することです。

しかし、3つすべてをまとめようとすると、「マルチパートで識別されたz.[通貨キー]をバインドできません」というメッセージが表示されます。これは、このキーが既存のテーブルにあり、一時テーブルまたはサブクエリを単独で使用できますが、両方を同時に使用することはできません。

サブクエリへの参加に関する問題については知っていますが、この状況では、問題は同じクエリ内のサブクエリと一時テーブルへの参加にあるようで、回避方法がわかりません。

コードは以下です。

declare @tmpFx table (currency_key int, effective_date_key int, expiration_date_key int, to_usd float, from_usd float ) --primary key (currency_key, date_key))
    insert into @tmpFx(currency_key, effective_date_key, expiration_date_key, to_usd, from_usd)
    select [currency key], cast(convert(char(8),[effective date],112) as int), cast(convert(char(8),[expiration date],112) as int), [to usd], [from usd]
    from v_fx --where [effective date] >= @beginDate

declare @fixedFx table (currency_key int, to_usd float, from_usd float primary key (currency_key))
    insert into @fixedFx(currency_key, to_usd, from_usd)
    select [currency key], [to usd], [from usd] 
    from v_fx where [effective date] = '2012-01-01'

select z.[currency key], --stat_fx.to_usd to_usd, stat_fx.from_usd from_usd, --q.*,-- 
stat_usd_amt2 = case when z.[currency key] = 100001 then q.orig_amt else 0 end --sum(q.orig_amt * stat_fx.to_usd)
from [dim country] z,
(select b.country_key, a.currency_key, a.data_type_key, sum(a.amount) orig_amt,
    sum(a.amount * stat_fx.to_usd) stat_usd_amt, 
    sum((a.amount * stat_fx.to_usd) * stat_fx.from_usd) home_curr_amt 
    from tbl_cohort a 
    inner join tbl_management_code b on a.management_code = b.management_code
    left outer join @tmpFx stat_fx on a.currency_key = stat_fx.currency_key
    where a.data_type_key = 1
    and a.date_key > 20111231
    group by b.country_key, a.currency_key, a.data_type_key) q
inner join @tmpFx stat_fx on z.[currency key] = stat_fx.currency_key
where q.[country_key]= z.[country key]
4

1 に答える 1

1

古いスタイルと新しいスタイルの間で結合形式を混在させているためだと思います(ninesidedが示唆したように)。私自身のデータで同様の問題をモックアップすることができ、バインドされていない識別子について同じエラーが発生しました。代わりに以下を試してください。

declare @tmpFx table (currency_key int, effective_date_key int, expiration_date_key int, to_usd float, from_usd float)
    insert into @tmpFx(currency_key, effective_date_key, expiration_date_key, to_usd, from_usd)
    select [currency key], cast(convert(char(8),[effective date],112) as int), cast(convert(char(8),[expiration date],112) as int), [to usd], [from usd]
    from v_fx

declare @fixedFx table (currency_key int, to_usd float, from_usd float primary key (currency_key))
    insert into @fixedFx(currency_key, to_usd, from_usd)
    select [currency key], [to usd], [from usd] 
    from v_fx where [effective date] = '2012-01-01'

select z.[currency key], 
    case when z.[currency key] = 100001 then q.orig_amt else 0 end AS stat_usd_amt2
from [dim country] z
JOIN (
    select b.country_key, a.currency_key, a.data_type_key, sum(a.amount) AS orig_amt,
    sum(a.amount * stat_fx.to_usd) as stat_usd_amt, 
    sum((a.amount * stat_fx.to_usd) * stat_fx.from_usd) as home_curr_amt 
    from tbl_cohort a 
    join tbl_management_code b
        on a.management_code = b.management_code
    left join @tmpFx stat_fx
        on a.currency_key = stat_fx.currency_key
    where a.data_type_key = 1
      and a.date_key > 20111231
    group by b.country_key, a.currency_key, a.data_type_key
) q
    ON q.[country_key] = z.[country_key]
join @tmpFx stat_fx 
    on z.[currency key] = stat_fx.currency_key

2 番目の一時テーブル (@fixedFx) を残しましたが、そのデータをまったく使用する予定がない場合は、削除することをお勧めします。

于 2013-02-22T13:52:23.907 に答える