2017-06-05 11 views
2

「なぜ」を省略して「何か」と「方法」に固執すれば、はるかに簡単になります。 特定の時点でのレコード状態のテンポラルテーブルを照会できるようにする必要があります。これは正当な構文であり、正確には私の後のことです。 この場合、Spineテーブルには、目的のDATETIME値のリストが含まれています。時間表 - 「パラメータ化」拡張SYSTEM_TIME構文

これは単に正しい構文を使用しないという問題ですか、それとも制限ですか? ダイナミックSQLに加えて、私は試してみることができる他の提案がありますか?

ありがとうございます!


これは、あなたが何の対応する行がPersonTemporalTableに存在しない場合でもSpine行を返すようにしたい場合は、outer apply()に切り替え@SQLZim

SELECT * 
FROM Spine  SP 
JOIN PetTemporal FOR SYSTEM_TIME ALL PT ON SP.SpineDT >= PT.ValidFrom AND SP.SpineDT < PT.ValidTo 
JOIN PersonTemporal FOR SYSTEM_TIME ALL PS ON SP.SpineDT >= PS.ValidFrom AND SP.SpineDT < PS.ValidTo 
              AND PS.PersonID = PT.PersonID 

答えて

4

によって提案に基づいて、私がやって上陸したものです。

PersonTemporalTableは、有効な日付範囲が含まれている場合:これは二つのテーブルを共有する場所の行を返すことになっている場合

select * 
from Spine S 
    cross apply (
    select top 1 ptt.* 
    from PersonTemporalTable ptt 
    where ptt.EffectiveDate <= S.DateTimeValueOfInterest 
    order by ptt.EffectiveDate desc 
) CA 

PersonTemporalTableは、単一の効果的な日付が含まれている場合

select * 
from Spine S 
    cross apply (
    select ptt.* 
    from PersonTemporalTable 
    where ptt.FromDateTime <= S.DateTimeValueOfInterest 
     and ptt.ThruDateTime >= S.DateTimeValueOfInterest 
) CA 

を対応するキー、例えばPersonId、その後cross apply()where、例えばにすることを含める:

select * 
from Spine S 
    cross apply (
    select top 1 ptt.* 
    from PersonTemporalTable ptt 
    where ptt.EffectiveDate <= S.DateTimeValueOfInterest 
     and ptt.PersonId = S.PersonId 
    order by ptt.EffectiveDate desc 
) CA 

延長system_time as of構文を利用して別のオプション:あなたはそうのようなcross apply()で使用するために、インラインテーブル値関数を作成することができます:

create function dbo.PersonTemporalTable_AsOf (@fromdate datetime2(7)) returns table as return (
select * 
    from PersonTemporalTable 
    for system_time as of @fromdate 
) 
go 
select * 
from spine s 
    cross apply dbo.PersonTemporalTable_AsOf(s.DateTimeValueOfInterest) ca 

dbfiddle.ukデモ:http://dbfiddle.uk/?rdbms=sqlserver_2016&fiddle=f1ee20893fe987e71cbd0cb12d09fccb

+0

そうですね。 WHERE句でこれを解決できます。 – MarkD

+1

@ MarkD私が指定した構文を使用する別のオプションを追加しました。 – SqlZim

+0

良いアイディア - 残念ながら、テーブルごとの関数またはテーブルを引数として取る関数が必要になることを意味します。 ご協力いただきありがとうございます:) – MarkD

関連する問題