Domanda

Il mio obiettivo è quello di ricorsione attraverso tabella tbl e mentre recursing attraverso quella tabella selezionare una sigla del paese (se esiste) da un altro tavolo e tbl2 accodare questi risultati insieme che sono incluse nel risultato finale.

L'esempio io uso verrà da questo post

tbl2 ha una chiave esterna 'tbl_id' di TBL e si presenta come questo

INSERT INTO @tbl2( Id, Abbreviation, tbl_id ) 
VALUES 
 (100, 'EU', 1) 
,(101, 'AS', 2) 
,(102, 'DE', 3) 
,(103, 'CN', 5)

* Nota:. Non tutti i paesi hanno abbreviazioni

Il trucco è, voglio che tutti i paesi in Asia ad almeno mostrare la sigla dell'Asia che è 'AS', anche se un paese non ha una sigla (come l'India, per esempio). Se il paese ha una sigla le esigenze di risultato a guardare come questo: la Cina: CN, AS

Ho capito in parte di lavoro utilizzando una sottoquery, ma l'India restituisce sempre NULL per l'abbreviazione. Si sta comportando come se non v'è un percorso completo di nuovo ricorsiva per la sigla, allora restituisce null. Forse la soluzione è quella di utilizzare un join esterno sinistro sul tavolo sigla? Ho provato per ore molte varianti e la subquery è così vicino come posso ottenere.

WITH  abcd 
    AS ( 
          -- anchor 
        SELECT  id, [Name], ParentID, 
                CAST(([Name]) AS VARCHAR(1000)) AS "Path" 
        FROM    @tbl 
        WHERE   ParentId IS NULL 
        UNION ALL 
          --recursive member 
        SELECT  t.id, t.[Name], t.ParentID, 
                CAST((a.path + '/' + t.Name + ':' +                 
                (
                    select t2.abbreviation + ','
                    from @tbl2
                    where t.id = t2.id
                )) AS VARCHAR(1000)) AS "Path"

        FROM    @tbl AS t 
                JOIN abcd AS a 
                  ON t.ParentId = a.id 
       )
SELECT * FROM abcd

A proposito, sto usando di SQL Server 2005 se quello che conta

È stato utile?

Soluzione

Prova questo esempio, che vi darà l'uscita (1 fila campione)

id  Name    ParentID    Path    abbreviation    (No column name)
5   China   2   Asia/China  CN,AS   Asia/China:CN,AS

Il TSQL essendo

DECLARE @tbl TABLE ( 
     Id INT 
    ,[Name] VARCHAR(20) 
    ,ParentId INT 
    ) 

INSERT INTO @tbl( Id, Name, ParentId ) 
VALUES 
 (1, 'Europe', NULL) 
,(2, 'Asia',   NULL) 
,(3, 'Germany', 1) 
,(4, 'UK',      1) 
,(5, 'China',   2) 
,(6, 'India',   2) 
,(7, 'Scotland', 4) 
,(8, 'Edinburgh', 7) 
,(9, 'Leith', 8) 

; 
DECLARE @tbl2 table (id int, abbreviation varchar(10), tbl_id int)
INSERT INTO @tbl2( Id, Abbreviation, tbl_id ) 
VALUES 
 (100, 'EU', 1) 
,(101, 'AS', 2) 
,(102, 'DE', 3) 
,(103, 'CN', 5)

;WITH abbr AS (
    SELECT a.*, isnull(b.abbreviation,'') abbreviation
    FROM @tbl a
    left join @tbl2 b on a.Id = b.tbl_id
), abcd AS ( 
          -- anchor 
        SELECT  id, [Name], ParentID,
                CAST(([Name]) AS VARCHAR(1000)) [Path],
                cast(abbreviation as varchar(max)) abbreviation
        FROM    abbr
        WHERE   ParentId IS NULL 
        UNION ALL
          --recursive member 
        SELECT  t.id, t.[Name], t.ParentID, 
                CAST((a.path + '/' + t.Name) AS VARCHAR(1000)) [Path],
                isnull(nullif(t.abbreviation,'')+',', '') + a.abbreviation
        FROM    abbr AS t 
                JOIN abcd AS a 
                  ON t.ParentId = a.id 
       )
SELECT *, [Path] + ':' + abbreviation
FROM abcd 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top