2016-09-15 56 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