Frage

Nach einer sehr lange SQL-Abfrage eine hat ein Ergebnis, das in dieser Form ist:

 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

, aber ich brauche es nicht auf diese Weise. Ich habe eine andere SQL-Anweisung zu diesem Ergebnis zu tun, wo ich verwenden müssen Gruppe der dritten und vierten Spalte. mit anderen Worten zwei Reihen in einem, wie folgt aus:

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
War es hilfreich?

Lösung

Sie dieses Problem, indem zwei zusätzliche Tabellen lösen könnte (temporär oder nicht, hängt von Ihren Anforderungen und SQL-Engine), die Struktur wird die Spalten aus Abfrage wird abbildet.

Zum Beispiel:

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)
)

Beachten Sie, dass dies nur ein Beispiel für die Struktur auf der Ausgabedaten basieren, die Sie vorgelegt haben.

Nachdem diese beiden Tabellen machen, würden Sie Daten aus Abfrage zu jeder der Tabellen einfügen.

Hinzugefügt: Sie müssen nicht zweimal die gleiche Abfrage auszuführen. es einmal ausführen, setzen Sie die Daten an die TableA dann SELECT auf TableA machen und Daten, über die TableB. Das spart Ihnen eine Menge Zeit.

Der letzte Schritt wäre Abfrage perfrom auf TableA und TableB mit JOIN auf ihren Spalten Col3 und Col4. So etwas wie folgt aus:

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

Hope dies dazu beitragen wird.

Auch bitte beachten Sie, dass diese Lösung einen großen Nachteil hat:

Wenn Sie Anzahl der Spalten oder dessen Datentypen in der oryginal Abfrage zu ändern, müssen Sie auch die Tabellendefinitionen aktualisieren. Mögliche Lösung dieses Problems wäre eine dynamische SQL verwenden, aber es ist in der Regel nicht adviced.

Nach bearbeiten (Sie haben in Ausgangsdaten zusätzlich NULLS zur Verfügung gestellt):

Wenn Sie NULL-Werte behalten möchten, sollten Sie verschiedene verwenden verbinden, zum Beispiel: LEFT OUTER JOIN

Weitere mögliche Lösungen sind:

  1. Just ersetzen (SELECT * FROM dbo.Test) mit dem langen Abfrage. Dies wird jedoch die Abfrage verursachen wird zweimal ausgeführt werden.

    SELECT A. *, B. * FROM (SELECT * FROM dbo.Test) A LEFT OUTER JOIN (SELECT * FROM dbo.Test) B = ON A.Col3 B.Col3 UND A.Col4 = B.Col4 UND A.Col1 <> B.Col1 UND A.Col2 <> B.Col2

  2. Wenn Sie SQL 2005 verwenden Sie könnten versuchen, CROSS verwenden Betreibers.

Es könnten auch andere Lösungen, aber Sie müssen mehr beschreibend über SQL-Engine, mit der Sie und Ihre Rechte in der Datenbank.

Andere Tipps

Hmm,

würde ich das Ergebnis in eine temporäre Tabelle werfen. Dann tun

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

Das ist natürlich davon aus, dass die col2 ein Indikator, welcher Teil des Paares ist Sie haben.

Ich fand die richtige Lösung, basierend auf der ersten Lösung von @Wodzu .

Zum einen erstellen Sie eine temporäre Ansicht, die das Ergebnis enthalten wird.

mit tmp als ( --Mein sehr lange SQL-Anweisung ... )

zweitens machen die Auswahl, da zwei von ihnen sind in dieser Art und Weise die Abfrage nur einmal aufgerufen wird.

a wählen. ** b. ** aus tmp einem inneren tmp b auf Join-Bedingungen.

Dank Zu

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top