Question

après une très longue requête SQL, le résultat obtenu est le suivant:

 col1 | col2 | col3 | col4
------+------+------+-----
1234  | 1    | aaaa | bbbb
2378  | 0    | aaaa | bbbb
9753  | 1    | cccc | uuuu
1234  | 0    | iiii | yyyy
2378  | 1    | iiii | yyyy
9753  | 1    | tttt | mmmm

mais je n'en ai pas besoin de cette façon. Je dois faire une autre instruction SQL sur ce résultat, où je dois utiliser groupe par la troisième et quatrième colonne. autrement dit deux lignes en une, comme ceci:

col1 | col2 | col3 | col4 | col5 | col6
-----+------+------+------+------+-----
1234 | 1    | 2378 | 0    | aaaa | bbbb
1234 | 1    | 2378 | 0    | aaaa | bbbb
9753 | 1    | null | null | cccc | uuuu
1234 | 0    | 2378 | 1    | iiii | yyyy
9753 | 1    | null | null | tttt | mmmm
Était-ce utile?

La solution

Vous pouvez résoudre ce problème en créant deux tables supplémentaires (temporaires ou non, selon vos besoins et le moteur SQL), avec la structure qui mappera les colonnes de la requête.

Par exemple:

CREATE TABLE TableA (
  Col1 int,
  Col2 bit,
  Col3 varchar(4),
  Col4 varchar(4)
)

CREATE TABLE TableB (
  Col1 int,
  Col2 bit,
  Col3 varchar(4),
  Col4 varchar(4)
)

Notez qu'il s'agit uniquement d'un exemple de structure basée sur les données de sortie que vous avez présentées.

Après avoir créé ces deux tables, vous devez insérer les données d'une requête dans chacune des tables.

Ajouté: Vous n'avez pas besoin d'exécuter la même requête deux fois. Exécutez-la une fois, placez les données dans la TableA, puis définissez SELECT sur TableA et placez les données dans la TableB. Cela vous fera gagner beaucoup de temps.

La dernière étape consisterait à effectuer une requête sur TableA et TableB avec JOIN sur leurs colonnes Col3 et Col4. Quelque chose comme ça:

SELECT A.Col1, A.Col2, B.Col1, B.Col2, COALESCE(A.Col3, B.Col3), COALESCE(A.Col4, B.Col4)  
FROM TableA A INNER JOIN TableB B ON A.Col3 = B.Col3 AND A.Col4 = B.Col4

J'espère que cela vous aidera.

N'oubliez pas non plus que cette solution présente un inconvénient majeur:

Si vous changez le nombre de colonnes ou leur type de données dans la requête oryginal, vous devrez également mettre à jour les définitions de la table. La solution possible à cela consisterait à utiliser un SQL dynamique, mais cela n’est généralement pas conseillé.

Après édition (vous avez fourni NULLS supplémentaire dans les données de sortie):

Si vous souhaitez conserver les valeurs NULL, vous devez utiliser une jointure différente, par exemple: LEFT OUTER JOIN

Une autre solution possible est la suivante:

  1. Remplacez simplement (SELECT * FROM dbo.Test) par votre requête longue. Cependant, cette requête sera exécutée deux fois.

    SÉLECTIONNER A. *, B. * FROM (SELECT * FROM dbo.Test) A JOINDRE EXTÉRIEUR GAUCHE (SELECT * FROM dbo.Test) B SUR A.Col3 = B.Col3 ET A.Col4 = B.Col4 ET A.Col1 & Lt; & Gt; B.Col1 ET A.Col2 & Lt; & Gt; B.Col2

  2. Si vous utilisez SQL 2005, vous pouvez essayer d'utiliser l'opérateur CROSS APPLY.

Il existe peut-être d'autres solutions mais vous devez être plus descriptif sur le moteur SQL que vous utilisez et sur vos droits sur la base de données.

Autres conseils

Hmm,

Je jetterais le résultat dans une table temporaire. Alors faites

select 
a.col1, 
a.col2, 
b.col1,
b.col2,
coalesce(a.col3, b.col3) as col5, 
coalesce(a.col4,b.col4) as col6 
from #tmp a 
outer join #tmp b 
on a.col3 = b.col3 and a.col4 = b.col4 
where a.col2 = 0 and b.col2 = 1

Ceci est bien sûr en supposant que la colonne 2 soit un indicateur de la partie de la paire que vous avez.

J'ai trouvé la bonne solution, basée sur la première solution de @Wodzu .

Tout d'abord, créez une vue temporaire qui contiendra le résultat.

avec tmp as ( --my très longue déclaration sql ... )

Deuxièmement, faites la sélection car il y en a deux. Ainsi, la requête n'est appelée qu'une seule fois.

sélectionnez a. **, b. ** dans tmp a jointure interne tmp b sous conditions.

Merci Wodzu

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top