sql >> データベース >  >> RDS >> Oracle

Oracleの「CONNECTBYPRIOR」、および「ORDERSIBLINGSBY」に相当するSQLServer

    LEVEL列のシミュレーション

    レベル列は、再帰部分のカウンターをインクリメントすることで簡単にシミュレートできます。

    WITH tree (empid, name, level) AS  (
      SELECT empid, name, 1 as level
      FROM emp
      WHERE name = 'Joan'
    
      UNION ALL
    
      SELECT child.empid, child.name, parent.level + 1
      FROM emp as child
        JOIN tree parent on parent.empid = child.mgrid
    )
    SELECT name 
    FROM tree;
    

    order siblings byのシミュレーション

    order siblings byのシミュレーション もう少し複雑です。列sort_orderがあると仮定します これは、親ごとの要素の順序を定義します(全体的な並べ替え順序ではありません-order siblings 必要ありません)次に、全体的な並べ替え順序を示す列を作成できます:

    WITH tree (empid, name, level, sort_path) AS  (
      SELECT empid, name, 1 as level, 
             cast('/' + right('000000' + CONVERT(varchar, sort_order), 6) as varchar(max))
      FROM emp
      WHERE name = 'Joan'
    
      UNION ALL
    
      SELECT child.empid, child.name, parent.level + 1, 
             parent.sort_path + '/' + right('000000' + CONVERT(varchar, child.sort_order), 6) 
      FROM emp as child
        JOIN tree parent on parent.empid = child.mgrid
    )
    SELECT * 
    FROM tree
    order by sort_path;
    

    sort_pathの式 SQL Server(少なくとも使用しているバージョン)には、先行ゼロを使用して数値をフォーマットする単純な関数がないため、非常に複雑に見えます。 Postgresでは、整数配列を使用して、varcharに変換します。 必須ではありませんが、SQLServerでも機能しません。



    1. AUTO_INCREMENTおよびLAST_INSERT_ID

    2. MySQLデータベースにApacheLuceneのインデックスを付け、同期を維持します

    3. Oracle:max(id)+1とsequence.nextvalの違い

    4. mysqlを使用してクエリ結果を変数に格納する方法