2016-11-09 73 views
3

我想要將兩個表連接在一起,以便返回所有外部行並且不重複主表的行。例如:SQL Server在主表中沒有重複項的情況下連接兩個表

T1 

    pk code value 
    1 One 100 
    2 Two 200 

T2 

    fk value 
    1  10 
    1  15 
    1  30 
    2  25 

我想T2的所有記錄,而不T1記錄複製,所以結果集我想是這樣的:

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 
相關問題