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

SQLServerでのOracleのCONNECTBYPRIORのシミュレーション

    再帰クエリを実装するSQL標準の方法。 IBMDB2およびSQLServerによると、 WITH 句。 CONNECT BY を翻訳する一例については、この記事を参照してください。 WITHに (技術的には再帰CTE )-この例はDB2用ですが、SQLServerでも機能すると思います。

    編集:どうやら元の質問者は特定の例を必要とします、これは私がすでに与えたURLを持つIBMサイトからのものです。与えられたテーブル:

    CREATE TABLE emp(empid  INTEGER NOT NULL PRIMARY KEY,
                     name   VARCHAR(10),
                     salary DECIMAL(9, 2),
                     mgrid  INTEGER);
    

    ここで、 mgrid 従業員のマネージャーのempidを参照します 、タスクは、 Joanに直接または間接的に報告するすべての人の名前を取得することです 。 Oracleでは、これは単純な<​​code> CONNECT :

    SELECT name 
      FROM emp
      START WITH name = 'Joan'
      CONNECT BY PRIOR empid = mgrid
    

    SQL Server、IBM DB2、またはPostgreSQL 8.4(およびSQL標準では、その価値があります;-)では、完全に同等のソリューションは、代わりに再帰クエリです(より複雑な構文ですが、実際には、さらに強力で柔軟性があります)。 ):

    WITH n(empid, name) AS 
       (SELECT empid, name 
        FROM emp
        WHERE name = 'Joan'
            UNION ALL
        SELECT nplus1.empid, nplus1.name 
        FROM emp as nplus1, n
        WHERE n.empid = nplus1.mgrid)
    SELECT name FROM n
    

    OracleのSTARTWITH 句は最初のネストされたSELECTになります 、再帰の基本ケース、 UNION 別のSELECTである再帰部分で編集 。

    SQLServer固有のWITHのフレーバー もちろん、MSDNに文書化されており、このキーワードを使用するためのガイドラインと制限、およびいくつかの例も示されています。



    1. PL / SQLを使用して、ファイルの内容をBLOBに取り込むにはどうすればよいですか?

    2. PostgreSQLで秒単位のタイムスタンプ間の違いを見つける

    3. PostgreSQLはWindowsで名前を処理します

    4. MySQLINクエリで順序を維持する