2016-09-15 12 views
1

2つの異なるテーブル:AとBからのクエリに問題があります。各テーブルはクラスのスコア結果を表します。表AおよびBは、異なる試験を表す。一部の学生は両方のテストを受けており、一部の学生は1つしか受けていません。ここで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

'b.fn = a.fn上の完全結合bからスコア2を選択し、(b.fn、b.fn)fn、coalesce(a.ln、b.ln)ln、a.scoreスコア1を選択します。 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内にdupesを持たず、tableBはTableB内にdupesを持ちません。 –

+0

私はテンポラリテーブルを使用しました。テーブルAとテーブルBを呼び出すだけでしたが、私の例では#aと#Bのテキストを削除しました。 –

0

あなたはこのようなクエリを試すことができます:あなたの結果は、完全な参加を設定取得するには、いずれかのALLまたはFULL OUTER JOINをUNIONで行くことができ

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

を助けにはなりません。

;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 
関連する問題