1 votes

sql server 2005 - retour d'une seule ligne lorsque 2 enregistrements sont présents dans la bonne table

J'ai deux tables sql server liées ... TableA et TableB.

***TableA - Columns***
TableA_ID     INT
VALUE         VARCHAR(100)

***TableB - Columns***
TableB_ID     INT
TableA_ID     INT
VALUE         VARCHAR(100)

Pour chaque enregistrement du tableau A, il y a toujours 2 dans le tableau B. Par conséquent, le tableau A a une relation de type "un à plusieurs" avec le tableau B.

Comment puis-je écrire une seule instruction SQL pour joindre ces tables et renvoyer une seule ligne pour chaque ligne de la table A qui comprend :

  • une colonne pour la colonne VALEUR dans le premier ligne correspondante dans le tableau B
  • une colonne pour la colonne VALEUR dans le deuxième ligne correspondante dans le tableau B ?

Merci.

2voto

Tomalak Points 150423

Pour exactement 2 enregistrements liés, c'est facile. Joignez la table B deux fois :

SELECT 
  A.TableA_ID,
  A.VALUE      AS VALUE_A
  B1.VALUE     AS VALUE_B1
  B2.VALUE     AS VALUE_B2
FROM
  TableA AS A
  INNER JOIN TableB B1 ON B1.TableA_ID = A.TableA_ID
  INNER JOIN TableB B2 ON B2.TableA_ID = A.TableA_ID
WHERE
  B1.TableB_ID < B2.TableB_ID

Si vous avez une colonne dans le tableau B qui détermine ce qui est la "première valeur" et ce qui est la "deuxième valeur", cela devient encore plus facile (et cela fonctionnerait ainsi pour N colonnes dans le tableau B, il suffit d'ajouter des jointures) :

SELECT 
  A.TableA_ID,
  A.VALUE      AS VALUE_A
  B1.VALUE     AS VALUE_B1
  B2.VALUE     AS VALUE_B2
FROM
  TableA AS A
  INNER JOIN TableB B1 ON B1.TableA_ID = A.TableA_ID AND B1.Type = '1'
  INNER JOIN TableB B2 ON B2.TableA_ID = A.TableA_ID AND B2.Type = '2'

Un indice composite sur TableB plus (TableA_ID, Type) contribue à cette adhésion.

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