2 votes

Sort de 'Scalar product' dans SQL Server

J'ai ces deux tables temporaires, et j'essaie de construire une sélection retournant le résultat suivant :

1 W  A
1 X  -
2 Y  B
2 -  C
3 Z  D
3 Z2 E
3 -  F

Voici la définition de mes tables temporaires :

CREATE TABLE #T1 (a INT, b VARCHAR(50))
CREATE TABLE #T2 (a INT, b VARCHAR(50))

INSERT INTO #T1 (a, b)
VALUES (1, 'W'), (1, 'X'), (2, 'Y'), (3, 'Z'), (3, 'Z2')

INSERT INTO #T2 (a, b)
VALUES (1, 'A'), (2, 'B'), (2, 'C'), (3, 'D'), (3, 'E'), (3, 'F')

SELECT * FROM #T1
SELECT * FROM #T2

DROP TABLE #T1
DROP TABLE #T2

Je n'ai aucune idée du type de joint que je pourrais utiliser ! J'en ai essayé plusieurs mais je n'ai pas obtenu le résultat escompté !

J'utilise SQL Server 2012.

Merci d'avance !

1voto

MotoGP Points 35270

Utilice FULL OUTER JOIN

SELECT COALESCE(t1.a, t2.a),
       ISNULL(t1.b,'-'),
       ISNULL(t2.b,'-')
FROM   (SELECT Row_number()OVER(partition BY a ORDER BY b) AS rn,*
        FROM   #T1) t1
       FULL OUTER JOIN (SELECT Row_number()OVER(partition BY a ORDER BY b) AS rn,*
                        FROM   #T2) t2
                    ON t1.a = t2.a
                       AND t1.rn = t2.rn

0voto

lad2025 Points 38168

Vous pourriez utiliser OUTER JOIN combiné avec ROW_NUMBER :

WITH t1 AS (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY a ORDER BY b) AS rn
    FROM #t1
), t2 AS (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY a ORDER BY b) AS rn
    FROM #t2
)
SELECT COALESCE(t1.a, t2.a) AS a,  t1.b,    t2.b
FROM t1
FULL JOIN t2
  ON t1.a = t2.a
 AND t1.rn = t2.rn;

Démonstration de Rextester

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X