タグ付けされた質問 「except」

2
再帰共通テーブル式でEXCEPTを使用する
次のクエリが無限行を返すのはなぜですか?EXCEPT句が再帰を終了すると予想していました。 with cte as ( select * from ( values(1),(2),(3),(4),(5) ) v (a) ) ,r as ( select a from cte where a in (1,2,3) union all select a from ( select a from cte except select a from r ) x ) select a from r Stack Overflow に関する質問に答えようとしているときに、私はこれに出会いました。

4
2つのテーブルまたはクエリ間で異なる行を簡単に表示する
同一のデータを持つ/返すことになっている2つの異なるテーブル/クエリがあるとします。これを確認します。次の例のように、各テーブルの一致しない行を表示して、すべての列を比較する簡単な方法は何ですか?テーブルには30個の列があり、その多くがNULL可能であると仮定します。 PKがない場合、またはPKごとに重複がある可能性がある場合、PK列だけで結合するだけでは十分ではなく、NULLを適切に処理する30の結合条件と厄介なWHERE条件でFULL JOINを実行する必要があります一致した行を除外します。 通常、問題が最悪であり、PKが論理的に使用可能になる可能性が非常に低いのは、スクラブされていないデータまたは完全に理解されていないデータに対して新しいクエリを作成するときです。問題を解決する2つの異なる方法を作成し、その結果を比較します。違いは、気づいていないデータの特殊なケースを強調しています。 結果は次のようになります。 Which Col1 Col2 Col3 ... Col30 ------ ------ ------ ------ ------ TableA Cat 27 86 -- mismatch TableB Cat 27 105 -- mismatch TableB Cat 27 87 -- mismatch 2 TableA Cat 128 92 -- no corresponding row TableB Lizard 83 NULL -- no corresponding …


1
避けるべきではありませんか?
一部のSQL Server開発者の間でNOT INは、非常に遅いと広く信じられている信念であり、クエリは、同じ結果を返すが「悪」キーワードを使用しないように書き換える必要があります。(例)。 それに真実はありますか? 例えば、使用してクエリの原因となるSQL Serverのいくつかの既知のバグ(バージョンは?)ありますNOT IN使用している同等のクエリよりも悪い実行計画を持っています LEFT JOIN組み合わせNULL小切手または (SELECT COUNT(*) ...) = 0中WHERE節?

5
SQL Serverリンクサーバーのパフォーマンス:リモートクエリがそれほど高価なのはなぜですか?
リンクサーバー経由で接続された2つのデータベースサーバーがあります。どちらもSQL Server 2008R2データベースであり、リンクサーバー接続は、現在のログインのセキュリティコンテキストを使用して、通常の「SQL Server」リンクを介して行われます。リンクされたサーバーは両方とも同じデータセンターにあるため、接続は問題になりません。 次のクエリを使用して、identifierローカルではなくリモートで使用可能な列の値を確認します。 SELECT identifier FROM LinkedServer.RemoteDb.schema.[TableName] EXCEPT SELECT DISTINCT identifier FROM LocalDb.schema.[TableName] 両方のテーブルには、列に非クラスター化インデックスがありますidentifier。ローカルは約260万行、リモートは54行のみです。しかし、クエリプランを見ると、実行時間の70%が「リモートクエリの実行」に費やされています。また、完全なクエリプランを調べる場合、推定ローカル行の数1は2695380(の後に来るクエリのみを選択した場合の推定行の数)の代わりになりますEXCEPT。 このクエリを実行すると、実際に時間がかかります。 不思議に思う:これはなぜですか?推定値は「ちょうど」外れていますか、それともリンクサーバーでのリモートクエリは本当にそれほど高価ですか?

2
SQLの2つの大きなデータセットを比較する効率的な方法
現在、一意のStoreKey/ProductKey組み合わせを含む2つのデータセットを比較しています。 1番目のデータセットには、StoreKey/ProductKey2012年1月から2014年5月の終わりまでの販売の一意の組み合わせがあります(結果= 45万行)。2番目のデータセットには、StoreKey/ProductKey2014年6月から今日までの販売の一意の組み合わせがあります(結果= 19万行)。 私はStoreKey/ProductKey、2番目のセットにはあるが、1番目のセットにはない組み合わせ、つまり6月初旬から販売された新製品を探しています。 これまで、2つのデータセットを一時テーブルにダンプし、両方のキーで両方のテーブルのインデックスを作成し、EXCEPTステートメントを使用して一意のアイテムを見つけました。 このような大きなデータセットを比較する最も効率的な方法は何ですか?このタイプの大規模な比較を行うより効率的な方法はありますか?

4
2つのテーブルを相互に検証する簡単な方法
ETLプロセスを行っています。すべてを言い終えると、同一のテーブルがたくさんあります。(2つの異なるサーバー上の)それらのテーブルが実際に同一であることを確認する最も簡単な方法は何ですか。私はスキーマとデータの両方を話しています。 個々のファイルまたはファイルグループでできるように、テーブルでハッシュを実行できますか?Red-Gateのデータ比較がありますが、問題のテーブルにはそれぞれ数百万の行が含まれているため、もう少しパフォーマンスの高いものが欲しいです。 私の興味を引く1つのアプローチは、組合声明のこの創造的な使用です。しかし、可能であれば、ハッシュのアイデアをもう少し詳しく調べたいと思います。 回答の更新後 将来の訪問者のために...ここに私が取った正確なアプローチがあります。これは非常にうまく機能し、各データベースのすべてのテーブルで実行しています。私を正しい方向に向けてくれた以下の回答に感謝します。 CREATE PROCEDURE [dbo].[usp_DatabaseValidation] @TableName varchar(50) AS BEGIN SET NOCOUNT ON; -- parameter = if no table name was passed do them all, otherwise just check the one -- create a temp table that lists all tables in target database CREATE TABLE #ChkSumTargetTables ([fullname] varchar(250), [name] …

1
EXCEPT演算子の背後にあるアルゴリズムは何ですか?
SQL Serverのカバーの下でExcept演算子がどのように機能するかの内部アルゴリズムは何ですか?内部的に各行のハッシュを取得して比較しますか? David Lozinksiは、SQLの調査を実行しました。新しいレコードが存在しない場合に、新しいレコードを挿入する最も速い方法です。以下の結果に密接に関連しています。 前提:1つの列のみを比較するため、左結合が最も高速になると思いますが、すべての列を比較する必要があるため、例外として最も時間がかかります。 これらの結果により、今、私たちの考えは、自動的かつ内部的に各行のハッシュを取ることを除いてですか?私は実行計画を除いて見て、それはいくつかのハッシュを利用しています。 背景:私たちのチームは2つのヒープテーブルを比較していました。テーブルAテーブルBにない行がテーブルBに挿入されました。 (レガシーテキストファイルシステムの)ヒープテーブルには、主キー/ GUID /識別子はありません。一部のテーブルには重複行があったため、各行のハッシュを見つけ、重複を削除して、主キー識別子を作成しました。 1)最初に、(ハッシュ列)を除いて、exceptステートメントを実行しました select * from TableA Except Select * from TableB, 2)次に、HashRowIdの2つのテーブル間で左結合比較を実行しました select * FROM dbo.TableA A left join dbo.TableB B on A.RowHash = B.RowHash where B.Hash is null 驚いたことに、Except Statement Insertが最速でした。 結果は実際にDavid Lozinksiのテスト結果に近いマップ

3
テーブルの行と一致しない値の特定
クエリで指定された一意の識別子のうち、テーブルに存在しない一意の識別子を簡単に確認できるようにしたいと思います。 よりよく説明するために、リスト「1、2、3、4」のどのIDがテーブルに存在しないかを確認するために、私が今行うことは次のとおりです。 SELECT * FROM dbo."TABLE" WHERE "ID" IN ('1','2','3','4')、テーブルにID 2の行が含まれていないとしましょう。 結果をExcelにダンプする 結果リストの各リスト値を検索する元のリストでVLOOKUPを実行します。 結果となるVLOOKUP #N/Aは、テーブルで発生しなかった値になります。 これを行うにはもっと良い方法があるはずだと思います。私は理想的には次のようなものを探しています チェックするリスト->チェックするテーブルにクエリ->テーブルにないリストのメンバー

1
SQL Server 2012で2つの大きな結果セットを比較する最も効率的な方法は何ですか
2つの大きな結果/行セットを比較する最も効率的な方法に対する現在のアドバイスは、EXCEPT演算子を使用することです。以下のこの自己完結型SQLスクリプトは、行サイズが大きくなる(@last値を変更する)と、非常に非効率になります。結合されたテーブルで一意のエントリを見つけようとしましたが、改善はありませんでした。 DECLARE @first AS INT, @step AS INT, @last AS INT; -- This script is comparing two record sets using EXCEPT -- I want to find additions from OLD to NEW -- As number of rows increase performance gets terrible -- I don't have to use two tables. I could …

2
このwhere句を結合に置き換えるにはどうすればよいですか?
通常、次のようなSQLを使用している場合: select * from employees where epmloyeeTypeId in (select id from type where name = 'emp') 私whereはこれで置き換えます: select e.* from employees e inner join type t on t.id=e.epmloyeeTypeId and t.name = 'emp' それが句not inではなく(以下のように)である場合、逆で同じことをすることは可能inですか? INSERT into Subscriptions(ProjectId, RecordTypeCID, NTID, Active, Added, LastUpdate, UpdateBy) SELECT @ProjectId, RecordTypeCID, @NTID, 1, GETDATE(), GETDATE(), …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.