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

一度使用した後、CTEにアクセスできないのはなぜですか?

    サンプルコードでは、CTEはUPDATEに対してのみ持続します。長持ちさせる必要がある場合は、#tempTableまたは@tableVariableにデータを入力してから、それらからUPDATEおよびDELETEを実行することを検討してください。

    UPDATEを拡張して、出力 を使用することもできます。 次のような句を使用すると、影響を受ける行をキャプチャできます。そして、ここのように、DELETEでそれらを使用します:

    set nocount on
    DECLARE @Table     table (PK int, col1 varchar(5))
    DECLARE @SavedPks  table (PK int)
    
    INSERT INTO @Table VALUES (1,'g')
    INSERT INTO @Table VALUES (2,'g')
    INSERT INTO @Table VALUES (3,'g')
    INSERT INTO @Table VALUES (4,'g')
    INSERT INTO @Table VALUES (5,'x')
    INSERT INTO @Table VALUES (6,'x')
    set nocount off
    
    ;WITH MYCTE
    AS 
    (
      SELECT PK, col1 FROM @Table
    )
    UPDATE MYCTE
        SET col1='xyz'
        OUTPUT INSERTED.PK
            INTO @SavedPks
        WHERE col1='g'
    
    SELECT 'A',* FROM @Table
    
    DELETE @Table
        WHERE PK IN (SELECT PK  from @SavedPks)
    
    SELECT 'B',* FROM @Table
    

    出力:

    (4 row(s) affected)
         PK          col1
    ---- ----------- -----
    A    1           xyz
    A    2           xyz
    A    3           xyz
    A    4           xyz
    A    5           x
    A    6           x
    
    (6 row(s) affected)
    
    (4 row(s) affected)
    
         PK          col1
    ---- ----------- -----
    B    5           x
    B    6           x
    
    (2 row(s) affected)
    


    1. OracleのSYSDATEに相当するPostgreSQLとは何ですか?

    2. MySQLでDESCインデックスを作成するにはどうすればよいですか?

    3. 複雑な関係を持つ複数のテーブルのクエリ

    4. postgres hstoreが存在し、同時に存在しません