Tipps zu MS-SQL/TSQL

13.12.2012 - Lesezeit: 4 Minuten

http://www.studentshelp.de/p/referate/02/6533.htm

Performance Probleme beim MS-SQL-Server

Schöne SQL-Anweisungen HAVING


SELECT 
E.FAD,
COUNT(*) AS "Anzahl Kinderhistorien",
K.VOR AS "Kind",
B.KURZ 
FROM b9_Kindhis H
LEFT JOIN b9_Kind K ON K.ID=H.KIND_ID
LEFT JOIN b9_Eltern E ON E.ID=K.ELT_ID
LEFT JOIN b9_Bearbeiter B ON B.ID=E.BEARBEITER_ID
WHERE '01.08.2010' BETWEEN H.VON AND H.BIS
GROUP BY E.FAD,H.KIND_ID,K.VOR,B.KURZ
HAVING COUNT(*)>1
ORDER BY 1 DESC
```-

```-
SELECT SUM(F.KFaellig),K.ELT_ID,E.FAD FROM b9_egFaellig F
LEFT JOIN b9_KIND K ON K.ID = F.KIND_ID 
LEFT JOIN b9_Eltern E ON E.ID = K.ELT_ID 
WHERE F.DATUM BETWEEN '01.01.2011' AND '31.12.2011'
GROUP BY K.ELT_ID,E.FAD
HAVING SUM(F.KFaellig)=0
ORDER BY 1
```-

**Vorsicht bei UNION**

UNION fasst alle gleichen Datensätze zusammen. Falls also wirklich alle Datensätze angezeigt werden sollen,
dann müssen diese sich unterscheiden. Deshalb habe ich hier die ID (X.IB,Y.ID,N.ID) mit angehängt.

```-
SELECT 1 AS ART,K.EART,E.FAD,X.DATUM,X.KASSE_SOLL,X.VS,0 AS LZ, X.ID, (SELECT COUNT(*) 
FROM b9_KassenLaufX   
WHERE ELT_ID=X.ELT_ID   AND KASSENLAUF_ID=1760  AND KITA_ID=X.KITA_ID) AS ANZAHL  
FROM b9_KassenLaufX X 
LEFT JOIN b9_Kita K ON K.ID=X.KITA_ID 
LEFT JOIN b9_Eltern E ON E.ID=X.ELT_ID 
WHERE X.KASSENLAUF_ID=1760 AND K.BVHAUSHALT=48 
UNION 
SELECT 2 AS ART,L.EGEART,F.FAD,Y.DATUM,Y.KASSE_SOLL,Y.VS,0 AS LZ,Y.ID, (SELECT COUNT(*) 
FROM b9_KassenLaufE   
WHERE ELT_ID=Y.ELT_ID   AND KASSENLAUF_ID=1760  AND KITA_ID=Y.KITA_ID) AS ANZAHL  
FROM b9_KassenLaufE Y 
LEFT JOIN b9_Kita L ON L.ID=Y.KITA_ID 
LEFT JOIN b9_Eltern F ON F.ID=Y.ELT_ID 
WHERE Y.KASSENLAUF_ID=1760 AND L.EGHAUSHALT=48 
UNION 
SELECT 3 AS ART,N.EART,N.FAD,N.FAELLIG,N.BETRAG,N.VS,N.LZ,N.ID, 1 AS ANZAHL  
FROM b9_KassenLaufN N 
WHERE N.KASSENLAUF_ID=1760 AND N.BVHAUSHALT=48 
ORDER BY 2,3,4
```-

**DELETE mit LEFT JOIN**

```-
DELETE b9_egErm FROM b9_egErm E
LEFT JOIN b9_Kind K ON K.ID=E.KIND_ID
WHERE K.ELT_ID=123 
```-

**UPDATE mit LEFT JOIN**

```-
UPDATE b9_Kindhis 
SET GRUPPENART=99
FROM b9_KindHis H
LEFT JOIN b9_Kind K ON K.ID=H.KIND_ID
WHERE K.ELT_ID IS NULL
AND H.GRUPPENART=0
GO
UPDATE b9_Kindhis 
SET GRUPPENART=0
FROM b9_KindHis H
LEFT JOIN b9_Kind K ON K.ID=H.KIND_ID
WHERE K.ELT_ID IS NULL
AND H.GRUPPENART=1
GO
UPDATE b9_Kindhis 
SET GRUPPENART=1
FROM b9_KindHis H
LEFT JOIN b9_Kind K ON K.ID=H.KIND_ID
WHERE K.ELT_ID IS NULL
AND H.GRUPPENART=99
GO
```-
**SELECT mit Unterabfrage**
```-
SELECT 
E.FAD,
Y.KURZ AS 'Bearbeiter',
K.Vor,
L.DATUM AS 'Letzter Monat',
H.EINKOMMEN,
T.GRUPPENR,
B.ART,
L.BEITRAG,
CASE B.WOFUER
  WHEN 1 THEN 'Kita'
  WHEN 2 THEN 'OGS'
  WHEN 3 THEN 'Tagespflege'
END AS 'Einrichtungsart'
FROM b9_BeiLis L 
LEFT JOIN b9_Kind K ON K.ID=L.KIND_ID
LEFT JOIN b9_Eltern E ON E.ID=L.ELT_ID
LEFT JOIN b9_EltHis H ON H.ID=L.ELTHIS_ID
LEFT JOIN b9_Beitab T ON T.ID=L.BEITAB_ID
LEFT JOIN b9_Beitrag B ON B.ID=T.ART_ID
LEFT JOIN b9_Bearbeiter Y ON Y.ID=E.BEARBEITER_ID
WHERE L.DATUM=(
  SELECT
  MAX(M.DATUM) 
  FROM b9_BeiLis M
  WHERE M.ELT_ID=L.ELT_ID
  GROUP BY M.ELT_ID
  HAVING MAX(M.DATUM)<'01.08.2010')
ORDER BY Y.KURZ,E.FAD  
```-
Tags: MSSQL