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
È stato utile?

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:

  1. È 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

  2. 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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top