2016-09-15 51 views
1

我無法從2個不同的表格查詢:A和B.每個表格代表一個類別的分數結果。表A和B代表不同的測試。有些學生已經參加了兩次考試,有些學生只參加了一次。SQL - 按名稱加入2個不同表格

這裏是什麼我的工作很短的版本:

CREATE TABLE A 
(
fn varchar(50), 
ln varchar(50), 
score1 int 
); 

CREATE TABLE B 
(
fn varchar(50), 
ln varchar(50), 
score2 int 
); 

INSERT INTO A (fn, ln, score) 
VALUES ('abe','farm',90); 
INSERT INTO A (fn, ln, score) 
VALUES ('carly','lina',70); 
INSERT INTO A (fn, ln, score) 
VALUES ('bobby','echo',40); 
INSERT INTO A (fn, ln, score) 
VALUES ('joe','robin',11); 

INSERT INTO B (fn, ln, score) 
VALUES ('abe','farm',95); 
INSERT INTO B (fn, ln, score) 
VALUES ('carly','lina',75); 
INSERT INTO B (fn, ln, score) 
VALUES ('geb','lina',100); 
INSERT INTO B (fn, ln, score) 
VALUES ('bobby','echo',40); 

我想代表所有的學生(不重複)所得到的數據表中的NULL了不存在的比分和比賽爲每個學生相應的名字和姓氏:

/===========================================\ 
| fn  | ln  | score1 | score2 | 
|===========================================| 
| abe  | farm  | 90  | 95  | 
| bobby | echo  | 40  | 40  | 
| carly | lina  | 70  | 75  | 
| geb  | lina  | NULL  | 100  | 
| joe  | robin | 11  | NULL  | 
\===========================================/ 

我在Microsoft SQL Server中工作。

+0

能否請你展示你迄今爲止嘗試過並註明您所遇到的問題。 –

+0

由於簡單的連接會給結果禮儀?你在嘗試不同的東西嗎?您正在尋找的輸出是什麼? –

+2

'select coalesce(a.fn,b.fn)fn,coalesce(a.ln,b.ln)ln,a.score score1,b.score score2 from a full join b on b.fn = a.fn and b.ln = a.ln' – ZLK

回答

2
SELECT 
    t.fn 
    ,t.ln 
    ,MAX(t.score1) as score1 
    ,MAX(t.score2) as score2 
FROM 
    (
     SELECT fn, ln, score as score1, NULL as score2 
     FROM 
      A 
     UNION ALL 
     SELECT fn, ln, NULL, score2 
     FROM 
      B 
    ) t 
GROUP BY 
    t.fn, t.ln 
0
select FName 
     ,LName 
     ,Score1 = sum(Score1) 
     ,Score2 = sum(Score2) 
from 
(
select 
    FName = A.Fn 
    ,LName = A.Ln 
    ,Score1 = A.Score1 
    ,Score2 = 0 
from #A A 
union all 
select 
    FName = B.Fn 
    ,LName = B.Ln 
    ,Score1 = 0 
    ,Score2 = B.Score2 
from #B B 
) x 
Group by Fname, LName 
+0

這假設每個給定表格中都沒有模糊。即tableA在tableA中沒有模糊,tableB在TableB中沒有模糊。 –

+0

如果您想調用表A和B,則只需從示例中刪除#a和#B文本即可使用臨時表。 –

0

你可以嘗試這樣的查詢:爲了讓您的結果集全加入不會幫助

SELECT 
    a.fn, 
    a.ln, 
    a.score1, 
    b.score2 
FROM a 
LEFT JOIN b 
    ON a.fn = b.fn 
    AND a.ln = b.ln 
UNION 
SELECT 
    b.fn, 
    b.ln, 
    a.score1, 
    b.score2 
FROM b 
LEFT JOIN a 
    ON a.fn = b.fn 
    AND a.ln = b.ln 
WHERE a.fn IS NULL 
AND a.ln IS NULL 
0

你可以去任何一個UNION ALL或FULL OUTER JOIN。

;WITH cte_1 
    As (  SELECT fn, ln, score as score1, NULL as score2 
    FROM A 
    UNION ALL 
    SELECT fn, ln, NULL, score as score2 
    FROM B) 
    SELECT fn,ln,Max(score1) score1,Max(score2) score2 
    FROM cte_1 
    GROUP BY fn,ln 

或者

SELECT ISNULL(a.fn, b.fn) fn, 
        ISNULL(a.ln, b.ln) ln, 
        a.score score1, b.score score2 
    FROM A 
     FULL JOIN B ON A.fn = B.fn and A.ln = B.ln 
0

試試這個

SELECT COALESCE(a.fn, b.fn) fn, 
    COALESCE(a.ln, b.ln) ln, 
    a.score score1, b.score score2 
FROM a FULL JOIN b ON b.fn = a.fn AND b.ln = a.ln 
ORDER BY fn