This commit is contained in:
Roger Rutishauser 2024-10-04 12:40:23 +02:00
parent fdbc391d3b
commit 1a59f9dc36

View File

@ -4,3 +4,59 @@ include_toc: true
--- ---
# Transact-SQL # Transact-SQL
## begin transaction
``` sql
begin transaction
-- ...insert or whatever...
commit; -- if all ok
rollback; --if not ok
```
## Check if a List of numbers exist in a table:
``` sql
-- declare array
DECLARE @IDList TABLE (ID INT);
-- fill array
INSERT INTO @IDList (ID)
VALUES (274), (7238), (7546), (7719), (36227);
-- create table with id and exists/not exist
SELECT l.ID, CASE WHEN vv.OBJ_ID IS NOT NULL THEN 'Exists' ELSE 'Does Not Exist' END AS Status
FROM @IDList l
LEFT JOIN VAL vv ON l.ID = vv.OBJ_ID;
```
## Mehrere Zeilen zusammen in 1 Zeile mergen
Annahme:
- Tabelle hat Spalten OBJ_ID, VAL_TEXT, FLD_ID
- OBJ_ID hat mehrere Einträge, mit unterschiedlichen Werten in VAL_TEXT und FLD_ID. Halt je nach Feld andere Feldwerte.
- Ich möchte eine Query, die mir 1 Zeile pro OBJ_ID ausgibt, mit 1 Spalte "url" und 1 Spalte "Name"
- "url" ist in VAL_TEXT mit FLD_ID xy (in diesem Bsp. egal) enthalten
- "name" ist in VAL_TEXT mit FLD_ID 40414 enthalten
- Bei der Query soll nur die OBJ_ID berücksichtig werden, die in einem VAL_TEXT "%wikidata%" drin hat
``` sql
WITH CTE_Wikidata AS (
-- Sammle alle OBJ_IDs, bei denen VAL_TEXT "wikidata" enthält
SELECT OBJ_ID, VAL_TEXT AS url
FROM VAL
WHERE VAL_TEXT LIKE '%wikidata%'
),
CTE_Person AS (
-- Sammle alle OBJ_IDs, bei denen FLD_ID = 240414 und die in CTE_Wikidata existieren
SELECT v.OBJ_ID, v.VAL_TEXT AS person
FROM VAL v
INNER JOIN CTE_Wikidata wd ON v.OBJ_ID = wd.OBJ_ID
WHERE v.FLD_ID = 40414
)
SELECT
wd.OBJ_ID,
wd.url,
p.person
FROM CTE_Wikidata wd
LEFT JOIN CTE_Person p ON wd.OBJ_ID = p.OBJ_ID;
```