Domanda
dopo una query sql molto lunga a ha un risultato che è in questa forma:
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
ma non ne ho bisogno in questo modo. devo fare un'altra istruzione sql su questo risultato in cui devo usare gruppo per la terza e la quarta colonna. in altre parole due file in una, in questo modo:
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
Soluzione
È possibile risolvere il problema creando due tabelle aggiuntive (temporanee o meno, in base ai requisiti e al motore SQL) la cui struttura mapperà le colonne dalla query.
Ad esempio:
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)
)
Nota che questa è solo una struttura di esempio basata sui dati di output che hai presentato.
Dopo aver creato queste due tabelle, è necessario inserire i dati dalla query in ciascuna delle tabelle.
Aggiunto: Non è necessario eseguire la stessa query due volte. Eseguire una volta, inserire i dati nella Tabella A, quindi selezionare SELEZIONA nella Tabella A e inserire i dati nella Tabella B. Ciò ti farà risparmiare un sacco di tempo.
L'ultimo passo sarebbe quello di eseguire una query su TableA e TableB con JOIN sulle loro colonne Col3 e Col4. Qualcosa del genere:
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
Spero che questo possa aiutare.
Inoltre, tieni presente che questa soluzione presenta un grave svantaggio:
Se si modifica il numero di colonne o il loro tipo di dati nella query originale, sarà necessario aggiornare anche le definizioni della tabella. Una possibile soluzione sarebbe utilizzare un sql dinamico, ma generalmente non è consigliato.
Dopo la modifica (hai fornito NULL aggiuntivi nei dati di output):
Se si desidera mantenere i valori NULL, è necessario utilizzare un join diverso, ad esempio: LEFT OUTER JOIN
Altre possibili soluzioni sono:
-
È sufficiente sostituire (SELEZIONA * DA dbo.Test) con la query lunga. Tuttavia, ciò causerà l'esecuzione della query due volte.
SELEZIONA A. *, B. * DA (SELEZIONA * DA dbo.Test) A SINISTRA ESTERNO UNISCITI (SELEZIONA * DA dbo.Test) B SU A.Col3 = B.Col3 AND A.Col4 = B.Col4 AND A.Col1 & Lt; & Gt; B.Col1 E A.Col2 & Lt; & Gt; B.Col2
-
Se si utilizza SQL 2005, è possibile provare a utilizzare l'operatore CROSS APPLY.
Potrebbero esserci altre soluzioni ma devi essere più descrittivo sul motore SQL che usi e sui tuoi diritti sul database.
Altri suggerimenti
Hmm,
Lancio il risultato in una tabella temporanea. Quindi fai
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
Questo è ovvio supporre che col2 sia un indicatore di quale parte della coppia hai.
Ho trovato la soluzione corretta, basata sulla prima soluzione di @Wodzu .
innanzitutto, crea una vista temporanea che conterrà il risultato.
con tmp come ( - mia affermazione sql molto lunga ... )
in secondo luogo, effettuare la selezione poiché ce ne sono due, in questo modo la query viene chiamata una sola volta.
seleziona a. **, b. ** da tmp a join interno tmp b a condizioni.
Grazie Wodzu