2017-01-13 24 views
0

からSELECTクエリで一部の行を交換する方法:私は2つのテーブルを持っている別のSELECT

T1:

ID Department ATTRIBUTES TEAM 
--- ---------- ---------- ------ 
1  R&D   Dress_Code NULL 
2  R&D   Dress_Code Web 
3  R&D   Food  System 
4  R&D   Food  NULL 
5  R&D   Color  NULL 
6  Marketing Food  System 

T2:

ID VAL 
--- ---------- 
1  Smart 
2  Casual 
3  Beef 
4  Chicken 
5  Green 
6  Fish 
T1の目的は、すべて表示することです

部門属性。

TEAMがNULLの場合、その部門の全員に適用されます。チームには、一般設定を上書きする特別な設定があることがあります。

例えば、私は私が書くことができますR &の「ウェブのチームとして設定D.

を取得したい:

SELECT T1.DEPARTMENT, T1.ATTRIBUTES, T1.TEAM, T2.VAL 
FROM T1 
LEFT JOIN T2 ON T1.ID = T2.ID 
WHERE T1.DEPARTMENT = 'R&D' AND T1.TEAM = 'Web' 

これは、ドレスコードはカジュアルであると言う一つのレコードが表示されます。

しかし、私は結果になりたい:

ATTRIBUTES VAL 
---------- ------ 
Dress_Code Casual 
Food  Chicken 
Color  Green 

同様にR & Dにおける「システム」チームのために、結果は、スマートドレスコード、牛肉、および緑色になります。

私は最初にすべてのR & D結果を選択して、上記の選択結果で行を置き換えることを考えています。

これはストアドプロシージャとして記述する必要があります。

ご協力いただきありがとうございます。 CTEおよびROW_NUMBER()を使用して

+2

マッチングの論理を書き留めてもいいですか?あなたが書いた2つのテーブルに基づいて、なぜ「食物属性」が「カジュアル・ヴァル」または「グリーン・ヴァル」ではなく、「チキン・ヴァル」と一致しなければならないのか分かりません。 – DVT

+0

あなたのCTEにMaxrecusrionを指定すると、これは自己ループを再帰的に行うのに役立ちます。最大値は32767です。デフォルトは0です。再帰に必要なレベルを知っていない場合は、0を指定してください。 –

+0

@DVT解決しようとしていた問題は、他の行と列も含みます。私は図示のようにT1とT2に単純化しました(ただし、単純に1つのテーブルに入れることができますが、元のテーブルではできません)。この場合、私はT1.ID = T2.IDでマッチします。 – Zelurd

答えて

1

with CTE as(
    select 
     ATTRIBUTES, 
     VAL,     
     T1.TEAM, 
     row_number() over (partition by ATTRIBUTES order by team desc) rn 
    from t1 t1 
    inner join t2 t2 on t1.ID =t2.ID 
    AND ( T1.TEAM = 'Web' or T1.TEAM is null) 
) 
select 
    ATTRIBUTES , 
    VAL 
from cte where rn=1 
order by val 

出力:

enter image description here

+0

作品はちょっとスマート。私は消化する時間が必要です:) +1 – Zelurd

+0

@Zelurd Googleそれ。作業を理解しやすい1行ずつ実行します。 –

0
SELECT 
    T1.DEPARTMENT, 
    T1.ATTRIBUTES, 
    T1.TEAM, 
    T2.VAL 
INTO #temp 
FROM T1 
INNER JOIN T2 ON T1.ID = T2.ID 
WHERE T1.TEAM is NULL 

SELECT 
    T1.ATTRIBUTES, 
    T2.VAL 
INTO #t2 
FROM T1 
INNER JOIN T2 ON T1.ID = T2.ID 
WHERE T1.TEAM = 'Web' 

UPDATE t 
SET t.VAL=b.VAL 
FROM #temp t 
join #t2 b on b.ATTRIBUTES=t.ATTRIBUTES 

SELECT 
    DEPARTMENT,  
    ATTRIBUTES, 
    TEAM, 
    VAL 
FROM #temp 

であっても、これはあまりにも役立ちます。

+0

まっすぐな答え:) +1 – Zelurd

関連する問題