sql >> Databáze >  >> RDS >> Sqlserver

Vyberte zpět seznam oddělený čárkami seskupený podle ID

select ET1.EntryID,
       (
       select ', '+T.Name
       from Tags as T
         inner join EntryTag as ET2
           on T.TagID = ET2.TagID
       where ET1.EntryID = ET2.EntryID
       for xml path(''), type
       ).value('substring(text()[1], 3)', 'varchar(max)') as TagsCommaDelimited
from EntryTag as ET1
group by ET1.EntryID

Rozbor dotazu

Hlavní dotaz provede group by takže pro každé EntryID získáte pouze jeden řádek .

Sloupec TagsCommaDelimited je vytvořen s korelovaným poddotazem.

V SQL Server for xml path se používá k vytvoření XML reprezentace výsledku dotazu. Máte dobrou kontrolu nad tím, jak je XML vytvořeno pomocí aliasů sloupců a parametrů path a root .

Zřetězená hodnota ', '+T.Name v souvisejícím poddotazu nebude mít název sloupce a prázdný parametr na for xml path('') vytvoří xml bez jakýchkoliv značek. Bude vrácena pouze jedna textová hodnota.

Když přidáte type do for xml dotaz bude datový typ XML .

Chcete-li získat hodnotu z XML, měli byste použít value() metoda. Mohli byste přetypovat na řetězec, ale pokud byste to udělali, dostali byste například & v řetězci všude tam, kde jste použili & .

První parametr v value() funkce je výraz xQuery používaný k získání požadované hodnoty. Použijte text() určit, že chcete hodnotu pouze pro aktuální prvek. [1] říká SQL Serveru, že chcete najít první textový uzel (zde máte pouze jeden), ale je to stále nutné.

Řetězec vytvořený pomocí for xml dotaz má na začátku řetězce navíc čárku a mezeru, kterou je třeba odstranit. Zde používám funkci XQuery substring získat vše kromě prvních dvou znaků.

Druhý parametr k value() určuje datový typ, který má být vrácen.



  1. Závažná chyba:Volání členské funkce query() na null

  2. Nelze se připojit k postgres pomocí jdbc v prostředí pyspark

  3. Použijte Firebase DB s místní DB

  4. ORA-6502 se spouštěčem protokolování Grant