2016-09-15 6 views
1

Ich habe Probleme beim Abfragen von 2 verschiedenen Tabellen: A und B. Jede Tabelle repräsentiert die Ergebnisse einer Klasse. Die Tabellen A und B repräsentieren verschiedene Tests. Einige Schüler haben beide Tests gemacht und einige haben nur einen gemacht.SQL - Verbinden Sie 2 verschiedene Tabellen nach Namen ohne Duplikate

Hier ist eine kurze Version von dem, was ich arbeite mit:

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); 

Ich möchte eine resultierende Datentabelle erhalten, die jeden Schüler (ohne Duplikate), die NULL-Werte aus den nicht vorhandenen Partituren und Streichhölzer darstellt Vor- und Nachnamen entsprechend für jeden Schüler:

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

Ich arbeite in Microsoft SQL Server.

+0

Können Sie mir bitte zeigen, was Sie haben versucht, so weit und zeigen die Probleme, die Sie haben. –

+0

Wie einfache Join geben die Ergebnisse Ritus? versuchst du etwas anderes? Nach welcher Ausgabe suchen Sie? –

+2

'select koaleszieren (a.fn, b.fn) fn, koaleszieren (a.ln, b.ln) ln, a.score score1, b.score score2 von einem vollständigen Join b auf b.fn = a.fn und b.ln = a.ln' – ZLK

Antwort

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

Dies setzt voraus, dass in den angegebenen Tabellen keine Duplikate vorhanden sind. Das heißt, Tabelle A hat innerhalb der Tabelle A keine Duplikate, und Tabelle B hat in Tabelle B keine Duplikate. –

+0

Ich benutzte temporäre Tabellen, wenn Sie nur die Tabellen A und B aufrufen möchten, entfernen Sie einfach den Text #a und #B aus meinem Beispiel. –

0

Sie können Abfrage wie folgt versuchen: Ihr Ergebnis voll beitreten Set bekommen wird

nicht helfen
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

Sie entweder mit einer UNION gehen kann ALL oder 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 

Oder

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

Versuchen dieser

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 
Verwandte Themen