diff --git a/t-sql/README.md b/t-sql/README.md index 77dadd4..8c94c62 100644 --- a/t-sql/README.md +++ b/t-sql/README.md @@ -4,3 +4,59 @@ include_toc: true --- # 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; +```