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

SQL Server:あるクエリに存在する行が別のクエリにない

    考えられる説明のデモンストレーション。

    テーブル スクリプトの作成

    SELECT *
    INTO #T
     FROM master.dbo.spt_values
    
     CREATE NONCLUSTERED INDEX [IX_T] ON  #T ([name] DESC,[number] DESC);
      

    クエリ 1 (35 件の結果を返す)

    WITH cte AS
    (
    SELECT *, ROW_NUMBER() OVER (ORDER BY NAME) AS rn
     FROM  #T
    )
    SELECT c1.number,c1.[type] 
    FROM cte c1
    JOIN cte c2 ON c1.rn=c2.rn AND c1.number <> c2.number
      

    クエリ 2 (前と同じですが、選択リストに c2.[type] を追加すると 0 の結果が返されます);

    WITH cte AS
    (
    SELECT *, ROW_NUMBER() OVER (ORDER BY NAME) AS rn
     FROM  #T
    )
    SELECT c1.number,c1.[type] ,c2.[type] 
    FROM cte c1
    JOIN cte c2 ON c1.rn=c2.rn AND c1.number <> c2.number
      

    理由

    重複する NAME の row_number() は指定されていないため、必要な出力列の最適な実行計画に適合するものを選択するだけです。 2 番目のクエリでは、これは両方の cte 呼び出しで同じです。最初のクエリでは、異なるアクセス パスが選択され、その結果、row_numbering が異なります。

    推奨される解決策

    ROW_NUMBER() over (order by t.[Date]) で CTE に参加しています

    予想に反して、CTE はおそらく 実現しない これにより、自己結合の一貫性が保証されるため、 ROW_NUMBER() 間の相関関係を想定します [Date] が重複しているレコードには存在しない可能性があります。

    ROW_NUMBER() over (order by t.[Date], t.[id]) を試すとどうなりますか 日付が同点の場合、row_numbering が一貫した順序であることが保証されます。 (または、id ができない場合にレコードを区別できる他の列/列の組み合わせ)



    1. ローカル データベースをリンク サーバーとして使用すると、遅延準備が完了できませんでしたというエラーが表示される

    2. 計算をコードまたはデータベースに保存しますか?

    3. 複数のキーでMySQLREPLACEINTO?

    4. Pythonのsqlsoupでスキーマの列名を取得するにはどうすればよいですか?