2017-07-19 2 views
0

設定を読んで、それをプレーンSQLのデータセットに適用することによって、ターゲットテーブル構造を生成する必要があります。 私は以下のターゲット表を考え出す必要があるJOINへのSQLルックアップテーブルとデータセットの生成

TC 
|Tbl|Col |Val|Text| 
|T1 |Col1|1 |A | 
|T1 |Col1|3 |B | 
|T1 |Col2|15 |A | 
|T2 |Col2|26 |A | 
|T2 |Col1|11 |B | 

以下に示すように私からの読み取りするには、以下のフォーマット

T1 
|Col1|Col2| 
|1 |12 | 
|2 |13 | 
|3 |14 | 
|4 |15 | 
|5 |16 | 

T2 
|Col1|Col2| 
|11 |22 | 
|21 |23 | 
|31 |24 | 
|41 |25 | 
|51 |26 | 

そして、設定テーブル内の2つのデータテーブルを持っている

TGT1 
|Col1|Col2|Text| 
|1 |12 |A | 
|2 |13 |NULL| 
|3 |14 |B | 
|4 |15 |A | 
|5 |16 |NULL| 

TGT2 
|Col1|Col2|Text| 
|11 |22 |B | 
|21 |23 |NULL| 
|31 |24 |NULL| 
|41 |25 |NULL| 
|51 |26 |A | 

ロジックは、完全なT1とT2を読み込み、TCテーブルに用意されているテキストフィールドを生成することです(TblとColはセットアップの実際のテーブルとカラムを参照しています)

この出力を生成する方法は完全に混乱しています。誰も私にいくつかのポインタを提供することができますか?これが誰かを助けてくれるならば!

WITH 
T1(Col1,Col2) AS 
(SELECT 1,12 UNION ALL 
SELECT 2,13 UNION ALL 
SELECT 3,14 UNION ALL 
SELECT 4,15 UNION ALL 
SELECT 5,16), 
T2(Col1,Col2) AS 
(SELECT 11,22 UNION ALL 
SELECT 21,23 UNION ALL 
SELECT 31,24 UNION ALL 
SELECT 41,25 UNION ALL 
SELECT 51,26), 
TC (Tbl,Col,Val,Text) AS 
(SELECT 'T1','Col1',1,'A' UNION ALL 
SELECT 'T1','Col1', 3,'B' UNION ALL 
SELECT 'T1','Col2',15,'A' UNION ALL 
SELECT 'T2','Col2',26,'A' UNION ALL 
SELECT 'T2','Col1',11,'B') 
SELECT ???? 
+0

多分、クロス結合を見てください – Missy

+0

どのようなタイプのデータベースですか?それはANSI SQLである必要がありますか? – adam0101

答えて

1

これはleft joinのように聞こえます。ここでは例としてt1を使用しての一つの方法は、次のとおりです。

select t1.*, tc.text 
from t1 left join 
    tc 
    on (t1.col1 = tc.val and tc.tbl = 't1' and tc.col = 'Col1') or 
     (t1.col2 = tc.val and tc.tbl = 't1' and tc.col = 'Col2') or 
     (t1.col3 = tc.val and tc.tbl = 't1' and tc.col = 'Col3') ; 

あなたはt2同じように近づくでしょう。

1

次は私の試みである:ここでは

SELECT T1.Col1, T1.Col2, TC.Text 
FROM 
    T1 LEFT JOIN TC 
     ON TC.Tbl = 'T1' 
     AND (
      T1.Col1 = TC.Val AND TC.Col = 'Col1' 
      OR T1.Col2 = TC.Val AND TC.Col = 'Col2' 
     ) 

SELECT T2.Col1, T2.Col2, TC.Text 
FROM 
    T2 LEFT JOIN TC 
     ON TC.Tbl = 'T2' 
     AND (
      T2.Col1 = TC.Val AND TC.Col = 'Col1' 
      OR T2.Col2 = TC.Val AND TC.Col = 'Col2' 
     ) 
1
SELECT 
    T1.Col1, 
    T1.Col2, 
    TC.[Text] 
FROM T1 
LEFT JOIN TC ON TC.Tbl = 'T1' 
      AND TC.VAL = CASE TC.Col 
          WHEN 'Col1' THEN T1.Col1 
          WHEN 'Col2' THEN T1.Col2 
          END; 

SELECT 
    T2.Col1, 
    T2.Col2, 
    TC.[Text] 
FROM T2 
LEFT JOIN TC ON TC.Tbl = 'T2' 
      AND TC.VAL = CASE TC.Col 
          WHEN 'Col1' THEN T2.Col1 
          WHEN 'Col2' THEN T2.Col2 
          END; 

は作業SQLFiddleです:http://sqlfiddle.com/#!6/8b7c0/9/0

1

私はもっとこのような何かだろう:

with u as 
(select 
tc.tbl, tc.col, tc.val, [Text] 
from 
tc inner join 
(select 't1' as tbl, 'col1' as col, col1 as val from t1 union 
select 't1' as tbl, 'col2' as col, col2 as val from t1 union 
select 't2' as tbl, 'col1' as col, col1 as val from t2 union 
select 't2' as tbl, 'col2' as col, col2 as val from t2) s on 
tc.tbl = s.tbl and 
tc.col = s.col and 
tc.val = s.val) 

select 't1' as tbl, col1, col2, [text] from 
t1 left outer join 
u on 
tbl = 't1' and 
case when col='col1' then col1 else col2 end = val 
union 
select 't2', col1, col2, [text] from 
t2 left outer join 
u on 
tbl = 't2' and 
case when col='col1' then col1 else col2 end = val 

sqlfiddle

+0

共通テーブル式の詳細。 https://docs.microsoft.com/en-us/sql/t-sql/queries/with-common-table-expression-transact-sql –

関連する問題