dedlfix: Sql Abfrage Union

Beitrag lesen

Tach!

Der erste SELECT erzeugt eine temporäre Table mit einer Row und Spaltennamen (View, Value).

Bestimmt nicht. Sonst müsste ja jede Abfrage, die Aliasnamen verwendet, eine temporäre Tabelle erzeugen. Für eine Ergebnismenge braucht es nicht zwangsläufig eine temporäre Tabelle. Das kann man ja auch anderweitig organisieren. Aber was auch immer passiert, es ist eine Blackbox, auf die man als Anwender keinen Einfluss hat. Insofern ist es zwar vielleicht interessant aber nicht erforderlich, die interne Arbeitsweise zu kennen. Die Beschreibung des Verhaltens in der Dokumentation muss ausreichen, um als Anwender damit zurechtzukommen.

Der zweite Select verwendet andere Spaltennamen - an der Stelle hätte ich einen Fehler erwartet, dass hier Äpfel mit Birnen vermengt werden sollen - passiert aber nicht. Statt dessen hat die UNION Tabelle die Spaltennamen der temporären Tabelle.

Da müssen selbstverständlich die Feldnamen der abzufragenden Tabelle genommen werden. Auch hier wird sicherlich keine temporäre Tabelle erzeugt, sondern die Ergebnisse dieser Abfrage mit der Ergebnismenge der ersten Abfrage zusammengefügt. Das geschieht übrigens positional, nicht über Namen.

In einem Test auf meinem SQL Server habe ich die Lage noch verschärft, indem ich die Datentypen unterschiedlich gemacht habe. Ergebnis: Die Namen kommen aus dem ersten SELECT, die Datentypen werden aus die Folge-SELECTs genommen. Wenn ich eine Tabelle mit einer INT Spalte habe und ihr per SELECT 'Huhu' as Name eine String-Zeile voranstelle, beklagt sich der Server, dass er 'Huhu' nicht verINTen könnte.

Bei mir nicht. Weder in der Reihenfolge, noch andersrum. Laut Dokumentation werden Typ und Länge aller beteiligten Select-Statements beachtet und die Ergebnismenge entsprechend passend gestaltet.

Manchmal muss man einfach die SQL Daten ein bisschen erweitern. Sei es als Sortier- oder Gruppierhilfe, oder sei es, weil ich so Defaults für die Programmlogik bereitstellen kann - ach keine Ahnung, eine konkrete Anwendung für komplett synthetische Zeilen hatte ich auch noch nicht. Unsinn würde ich deshalb nicht dazu sagen.

Das Ansinnen ist jedenfalls genauso sinnig oder unsinnig, wie berechnende Ausdrücke oder auch konstante Literale neben Feldabfragen in die Select-Klausel zu schreiben. Ohne die Aufgabenstellung zu kennen, kann man darüber nicht befinden.

dedlfix.