1

SQL Server 2012 を使用しています

LOCATIONDETAIL テーブル

OID     LOCATIONNAME    PARENTID
1           GLOBAL          0
2           NORTH           1
3           SOUTH           1
4           NORTH1          2
5           SOUTH1          3

LOCATIONSITECONFIG テーブル

OID LOCATIONID  SITENAME
1       2        TEST

再帰 CTE クエリを使用します

;WITH LOCALSITEHIERARCHY AS
(
    SELECT  A.OID
            ,A.PARENTOID
            ,CAST(A.LOCATIONNAME + ' ( ' + LSC.SITENAME + ' )' AS NVARCHAR(100)) AS NAME
            ,LSC.OID AS SITEOID
    FROM LOCATIONDETAIL A
            INNER JOIN LOCATIONSITECONFIG LSC 
                ON LSC.LOCATIONDETAILOID = A.OID                
    WHERE
            LSC.SITENAME <> 'GLOBAL' AND LSC.RECSTATUS = 'A'
    UNION ALL
    SELECT 
        A.OID
        ,A.PARENTOID
        ,CAST(A.LOCATIONNAME AS NVARCHAR(100))                  
        ,LH.SITEOID 
    FROM LOCATIONDETAIL A 
        INNER JOIN LOCALSITEHIERARCHY LH ON A.PARENTOID = LH.OID
)

SELECT * FROM LOCALSITEHIERARCHY

NORTH は Global の別のサイトになりました。このクエリは、OK であるツリー構造で North と North 1 を返します。

Global を新しいサイトとして作成するとき、North を Global サイトの一部として含めたくありません。

例 、グローバルである (NEWTEST) という名前のサイト 2 を追加する

LOCATIONSITECONFIG テーブル

OID LOCATIONDETAILOID   SITENAME
1       2               TEST
2       1               NEWTEST

上記のクエリは、Global 、NORTH、NORTH1、SOUTH、SOUTH1、および NORTH(TEST) AND NORTH1 (レコードの複製) を返します。

クエリで Global 、NORTH (TEST)、NORTH1、SOUTH、SOUTH1 を返すようにしたい

子サイトが既に作成されている場合、クエリは無視する必要があります。助けてください

4

1 に答える 1