2016-06-28 5 views
0

テーブルa、a_xref_b、およびbを持つ正規化されたデータベースからレポートを生成しようとしています。SQL Server 2014でビューを作成して、一部のデータがないクロスリファレンステーブルのデータを表示するにはどうすればよいですか?

CREATE TABLE a (a_rid INT primary key, a1 varchar(20),); 

CREATE TABLE b (b_rid INT primary key, b1 varchar(20), b2 varchar(20)); 

CREATE TABLE a_xref_b (a_rid INT, b_rid INT,xref_type int 
CONSTRAINT fk_a FOREIGN KEY (a_rid) REFERENCES a (a_rid), 
CONSTRAINT fk_b FOREIGN KEY (b_rid) REFERENCES b (b_rid)); 

INSERT INTO a VALUES (1,'John'), (2,'Sue') 
INSERT INTO b VALUES (1,'Atlanta','GA'), (2,'Macon','GA'), (3,'Opp','AL') 
INSERT INTO a_xref_b VALUES (1,1,1), (1,2,2), (2,3,1) 

表A及びBは、相互参照され、相互参照は、Bのデータが何を表すかを定義するタイプを有する有します。

シナリオ - ジョンには主要都市と代替都市が用意されています。スーは主要都市だけを提供した。

私は、名前、主要都市、および代替を持つページを読み込むためのビューを作成しようとしています。

Name b_rid_t1 City_t1 St_1 b_rid_2 City_t2 St_t2 
John 1   Atlanta GA 2   Macon GA 
Sue 3   Opp  AL NULL  NULL  NULL 

それはスーの記録をドロップしかし、私はこの

select 
    a.a1, 
    b_1.b_rid, 
    b_1.b1, 
    b_1.b2, 
    b_2.b_rid, 
    b_2.b1, 
    b_2.b2  
from 
    a  
left join 
    a_xref_b as xf1 
     on a.a_rid = xf1.a_rid  
inner join 
    b as b_1 
     on xf1.b_rid = b_1.b_rid 
     and xf1.xref_type = 1  
left join 
    a_xref_b xf2 
     on a.a_rid = xf2.a_rid  
inner join 
    b as b_2 
     on xf2.b_rid = b_2.b_rid 
     and xf2.xref_type = 2 

を試してみました。外部参照からbへの左結合に変更すると、重複レコードが取得されます。

実際のシナリオは、アドレステーブルと相互参照されるコンタクトテーブルで、xrefテーブルにはタイプフィールドがあります。私たちはページを読み込むためのビューを構築しようとしています。

+0

使用を?? – sagi

+0

あなたの質問はうまくいきますが、挨拶、感謝の気持ちなどは騒音とみなされます。あなたは実際の質問に集中することができ、すべてが問題ありません。あなたのsqlのreadyabilityを向上させるには、適切なインデントを加えるためにhttp://www.freeformatter.com/sql-formatter.htmlのようなツールを使用することができます – Philipp

答えて

1

これを試すと、xref_type条件にa_xref_bテーブル結合を追加する必要があります。

select 
    a.a1, 
    b_1.b_rid, 
    b_1.b1, 
    b_1.b2, 
    b_2.b_rid, 
    b_2.b1, 
    b_2.b2  
from 
    a  
left join a_xref_b as xf1 on a.a_rid = xf1.a_rid  
    and xf1.xref_type = 1  
left join b as b_1 on xf1.b_rid = b_1.b_rid  
left join a_xref_b xf2 on a.a_rid = xf2.a_rid  
    and xf2.xref_type = 2 
left join b as b_2 on xf2.b_rid = b_2.b_rid 
+0

Jatin - ありがとうございます。これはまさに私が望んだことでした。 –

0

ピボットテーブルを使用するか、同じ種類の結果を与えるSQL文を使用する必要があります。例:

;WITH Main 
      AS (SELECT a1 AS Name 
         ,b1 AS City 
         ,b2 AS Code 
         ,xref_type 
       FROM  a_xref_b 
         LEFT JOIN a ON a_xref_b.a_rid = a.a_rid 
         LEFT JOIN b ON a_xref_b.b_rid = b.b_rid 
      ) 
    SELECT Name 
      ,MAX(CASE WHEN xref_type = 1 THEN City 
       END) FirstCity 
      ,MAX(CASE WHEN xref_type = 1 THEN Code 
       END) FirstCode 
      ,MAX(CASE WHEN xref_type = 2 THEN City 
       END) AlternateCity 
      ,MAX(CASE WHEN xref_type = 2 THEN Code 
       END) AlternateCode 
    FROM Main 
    GROUP BY Name 
0

別のアプローチは、連合を使用することができます明確な

select max(name) name, max(id1) id1, max(city1) city1, max(state1) state1, max(id2) id2, max(city2) city2, max(state2) state2 
from(
    select a.a1 as name, xf1.b_rid id1, xf1.b1 city1, xf1.b2 state1, null id2, null city2, null state2 
    from a left join 
    (select a_rid, b1, b2, b.b_rid from a_xref_b inner join b on a_xref_b.b_rid = b.b_rid 
    where xref_type = 1) xf1 on a.a_rid = xf1.a_rid 
    union 
    select a.a1 as name, null id1, null city1, null state1,xf1.b_rid id2, xf1.b1 city2, xf1.b2 state2 
    from a left join 
    (select a_rid, b1, b2, b.b_rid from a_xref_b inner join b on a_xref_b.b_rid = b.b_rid 
    where xref_type = 2) xf1 on a.a_rid = xf1.a_rid 
)t group by name 
関連する問題