mk-prg-net \ ms-sql \ tsql \queries \subselect

Subselects

Subselect sind ein Feature, das nicht jeder Datenbankserver mitbringt. TSQL kann Subselects !

Durch Subselect können aus einer Select- Abfrage weitere Select- Abfragen gestartet werden. Um z.B. die größte Datei in einer Tabelle zu bestimmen, die Dateien und ihren Speicherplatzverbrauch auflistet, muss zuerst die maximale Dateigröße bestimmt werden. Mit diesem Wert kann dann der Datensatz gesucht werden, der diesen Speicherplatzverbrauch hat:

  use dmsmin
go
Declare @MaxSize as BigInt
-- 1) Größe der größten Datei bestimmen
select @MaxSize = Max(SizeInBytes)
from data.FileInfos
-- 2) Name der größten Daten bestimmen
select [name], SizeInBytes
from data.FileInfos
where SizeInBytes = @MaxSize

Mittels Subselect können beide Schritte in einer einzigen Select- Anweisung zusammengefasst werden. Variablen werden nicht mehr benötigt:

  -- Name der größten Daten 
select [name], SizeInBytes
from data.FileInfos
where SizeInBytes = (select Max(SizeInBytes)
                     from data.FileInfos)
go

Temporäre Tabellen

In seltenen Fällen ist es sinnvoll, in einer Sitzung Ergebnisse von Abfragen zwischenzuspeichern, um in weiteren Abfragen auf diese zurückzugreifen. Dies hat aber den Nachteil, das der Server hierdurch massiv belastet wird ! In jedem Fall sollte geprüft werden, ob durch Views oder Subselects kein alternativer Lösungsweg besteht.

  use dmsmin
go
drop table #sizepertype
go
-- Liste des Speicherplatzverbrauches pro typ in temp- Tabelle speichern
select ext, Sum(SizeInBytes)/1024.0 as SumSizeInKB
into #SizePerType
from data.FileInfos
group by ext
order by SumSizeInKb 
select * from #SizePerType
-- Wie groß ist der Anteil des Speichers pro Typ in bezug auf den Gesamtverbrauch
select ext, Round(100 * SumSizeInKB / (select Sum(SizeInBytes)/1024.0 from data.FileInfos), 1) as [Anteil an Gesamt]
from #SizePerType