2016-08-28 3 views
3

私はSQLで習熟していないので、システムで変換されたデータを検証しようとしています。最初に変換の前に開発したクエリの中には、その作業を証明していないものがあります。ソースデータをトレースして変換が正しいことを確認できましたが、これはアカウント単位で行われています。私は完全なデータセットを表示するためのクエリを持っています。2番目(SQL Server)のパラメータとして1からの結果を渡すためのSQLクエリの結合

私は2つのクエリまでソリューションを処理することができましたが、完全なデータセットを表示するためにそれらを結合する方法を理解することはできません。最初のクエリの1つの値は2番目のクエリ。

クエリ1

select distinct 
    CreatedDate, AccountNum 
From 
    Table1 A 
Join 
    Table2 B on A.Column1 = B.Column1 and a.Column2 = b.Column2 
Join 
    Table3 C on A.Column3 = C.Column3 and A.Column4 = C.Column4 
where 
    Condition A and Condition B 

クエリ2

Select distinct 
    AccountNum, Responsible 
From 
    Table3 D 
Join 
    Table4 E on D.Column1 = E.Column2 
where 
    StartDate <= 'DateValue' and EndDate > 'DateValue' 

私は、クエリ2にDateValueとしてクエリ1からCreatedDate値を使用したいが、私は与えるために解決策を見つけていません私が探している結果

アカウント番号のような各クエリに修飾子を追加すると、クエリ1の結果が1になります。次に、CreatedDateをクエリ2に入れて、必要な結果を得ます。 2番目のクエリでアカウント番号のみを取得した場合、期間Aから期間Bまで責任あるXの値を持ち、期間Cから期間Dまで責任ある値Yの2つの結果が得られます。ここではCreateDateの値間に落ちる。これらのクエリを組み合わせようとしたすべてが、そのY値が必要なときに、Responsible値X(または結果なし)のいずれかになります。

私は正常に2つのクエリを統合することができませんでした。そのCreatedDate値をResponsible値を決定するパラメータとして渡すことができます。

最初のクエリの結果の中間テーブルを作成してから、そのテーブルを2番目のクエリに結合する方法があります。ただし、データベースのテーブル/レコードの作成/挿入/更新にアクセスする権限がないため、このメソッドを使用することはできません。

答えて

0

は、私はあなたがこの

SELECT DISTINCT accountnum, 
       responsible 
FROM table1 A 
     JOIN table2 B 
     ON A.column1 = B.column1 
      AND a.column2 = b.column2 
     JOIN table3 C 
     ON A.column3 = C.column3 
      AND A.column4 = C.column4 
     JOIN table4 D 
     ON D.column1 = C.column2 
      AND startdate <= createddate 
      AND enddate > createddate 
where Condition A and Condition B 

注意を探していると思う:あなたは別の解決策は、テーブル値に最初のクエリを作ることですcolumns

0

に適切alias名を追加する必要がありますUDF:

Create function GetCreateDateAndAcctId([Parameters for 2 conditions here]) 
Returns table As 
Return 
    select distinct CreatedDate, AccountNum 
    From Table1 a 
     Join Table2 b 
      on b.Column1 = a.Column1 
      and b.Column2 = a.Column2 
     Join Table3 c 
      on c.Column3 = a.Column3 
      and c.Column4 = a.Column4 
    where condition1 -- here put predicate  
     and condition2 -- using input parameters 

次に、それを使用するには、それを2番目のクエリのテーブルとして含めますこのように:あなたがこれを行う場合は

Select distinct AccountNum, Responsible 
From Table3 d 
    Join Table4 e 
     on e.Column2 = d.Column1 
    outer apply dbo.GetCreateDateAndAcctId(Parameters) cd 
where StartDate <= cd.CreatedDate and EndDate > cd.CreatedDate 

、最初のクエリのためのロジックは再利用のための個別のデータベース・オブジェクトに残っている(あなたはそれをコピーすることなく、他のプロセスで使用することができます)。 SQL Serverクエリプロセッサは、実際には2番目のクエリのSQLと1つの再利用可能なコンパイルされた実行プランを組み合わせます。

(これはバグや機能強化を修正するための唯一の場所です。
0
Select distinct AccountNum, Responsible 
    From Table3 D 
    Join Table4 E on D.Column1 = E.Column2 
    Join (
     select distinct CreatedDate, AccountNum 
      From Table1 A 
      Join Table2 B on A.Column1 = B.Column1 and a.Column2 = b.Column2 
      Join Table3 C on A.Column3 = C.Column3 and A.Column4 = C.Column4 
     where Condition A and Condition B 
     ) X 
    on D.AccountNum=X.AccountNum 
    and D.StartDate <= X.CreatedDate and EndDate > X.CreatedDate 
関連する問題