IT-Wissen/t-sql/README.md
Roger Rutishauser 1a59f9dc36 tsql
2024-10-04 12:40:23 +02:00

1.6 KiB

Table of Contents

Transact-SQL

begin transaction

begin transaction
-- ...insert or whatever...
commit; -- if all ok
rollback; --if not ok

Check if a List of numbers exist in a table:

-- 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
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;