2016-11-09 10 views
3

2つのテーブルを結合して、すべての外部行が返され、プライマリテーブルの行が重複しないようにします。たとえば:SQL Serverプライマリテーブルに重複のない2つのテーブルを結合します

T1 

    pk code value 
    1 One 100 
    2 Two 200 

T2 

    fk value 
    1  10 
    1  15 
    1  30 
    2  25 

私は、T1のレコードは複製せずにT2のすべてのレコードをしたいので、結果セットには、私は次のようになりたい:

T2.fk T1.code T1.value T2.value 
    1  One  100  10 
    1  NULL  NULL  15 
    1  NULL  NULL  30 
    2  Two  200  25 

は、SQL Serverが存在することを達成するための方法に参加します?

+0

「LEFT JOIN」をチェックしてください! – jarlh

+0

は以下を参照してください。その簡単な理解http://www.codeproject.com/KB/database/Visual_SQL_Joins/Visual_SQL_JOINS_orig.jpg – aads

+0

これらの 'NULL'値の背後にある論理は何ですか?普通の結合はあなたにこの結果セットを与えません。 –

答えて

3

あなたはT2であなたの行をランク付けし、参加条件としてleft join含むランクを実行する必要があります。ここでは

with cte as(select *, row_number() over(partition by fk order by value) as rn from T2) 

select c.fk, t.code, t.value, c.value 
from cte c 
left join T1 t on c.fk = t.pk and c.rn = 1 

は完全な例である:

DECLARE @t1 TABLE 
    (
     pk INT , 
     code VARCHAR(MAX) , 
     value INT 
    ) 
INSERT INTO @t1 
VALUES (1, 'One', 100), 
     (2, 'Two', 200) 

DECLARE @t2 TABLE (fk INT, value INT) 
INSERT INTO @t2 
VALUES (1, 10), 
     (1, 15), 
     (1, 30), 
     (2, 25); 
WITH cte 
      AS (SELECT * , 
         ROW_NUMBER() OVER (PARTITION BY fk ORDER BY value) AS rn 
       FROM  @t2 
      ) 
    SELECT c.fk , 
      t.code , 
      t.value , 
      c.value 
    FROM cte c 
      LEFT JOIN @t1 t ON c.fk = t.pk 
           AND c.rn = 1 
+1

パーフェクト...私は実際にマークを打つことなくすべての答えの周りにいるようだった:/ – Scribbly

0

はこれを試してみてください:

select T2.fk, 
CASE 
    WHEN (SELECT COUNT(*) FROM t2 tother WHERE tother.fk = t2.fk 
    AND tother.value > t2.value) > 0 THEN NULL ELSE t1.code 
END, 
CASE 
    WHEN (SELECT COUNT(*) FROM t2 tother WHERE tother.fk = t2.fk 
    AND tother.value > t2.value) > 0 THEN NULL ELSE t1.value 
END,T2.value 
from t2 
join t1 
on t2.fk = t1.pk 
0
DECLARE @t1 TABLE (pk int,code varchar(10),value int) 
    DECLARE @t2 TABLE (fk int,value int) 

    INSERT INTO @t1 
    SELECT 1,'one',100 
    UNION 
    SELECT 2,'two',200 

    INSERT INTO @t2 
    SELECT 1,10 
    UNION SELECT 1,15 UNION SELECT 1,30 UNION SELECT 2,25 


;WITH cte AS(
SELECT t2.fk,t2.value t2val,t1.pk,t1.code,t1.value t1val,ROW_NUMBER() OVER(PARTITION BY fk ORDER BY fk) rno FROM @t2 t2 LEFT JOIN @t1 t1 on t2.fk=t1.pk) 
SELECT fk,code=(CASE WHEN rno=1 THEN code ELSE null END),t1val=(CASE WHEN rno=1 THEN t1val ELSE NULL END),t2val FROM cte 

出力

fk code t1val t2val 
1 one  100  10 
1 NULL NULL  15 
1 NULL NULL  30 
2 two  200  25 
関連する問題