Articles

Redgate Hub

はじめに

テーブルまたは結果を比較する必要がある理由はいくつかあります。場合によっては、テーブルに同じデータが含まれているかどうかを知る必要があります。 これは、ルーチンまたはバッチが適切なデータを含む結果を生成するかどうかを知る必要があるテストアサーションでは一般的です。 変数に特定の谷を与えられたとき。 それは間違っているか正しいかのいずれかです

  • 時には、どの行が変更されたか、どの列が変更されたか、どのように変更されたかを特定することな列と行の両方の点で大きなテーブルがあり、その値を変更した列を具体的に示すものが必要な場合があります。 また、”目で”スキャンする時間を無駄にする必要があるルーチン内のバグを追跡するときにも、これが必要な場合があります。
  • SQLでこれらの三つのかなり異なるタスクに取り組むことになります

    二つのテーブルの行数が異なる場合、それらはもちろん同じではあり ただし、Table_Bにtable_Aのすべての行が含まれているかどうかを違いなく知る必要がある場合があります。 より詳細にしたい場合は、共通していないテーブルの行、または主キーで示されている共通の行が異なっていたことを知りたい場合もあります。 なぜちょうど二つのテーブルを比較するのに固執? あなたが必要とするだけ多くを比較する方法があります。 (たとえば、複数のデータベーススナップショットのメタデータを比較する場合など)。 はい、多くのバリエーションがあります

    あなたは確かに、このようなものを行うためのツールや機能を持っていますか?SQL Data Compare、TableDiff、tSQLt、Change Data Captureなどのツールのための場所が常にあります。 多くは状況やタスクの種類によって異なります。 ライブシステムでデータの変更に対する監査を行うことの問題は、テーブルとデータベースの同期と同様に、別のトピックです。 XML文書の比較も範囲外です。 私たちは純粋にテーブル内のデータのルーチン比較を扱うつもりです

    私は次のときにテーブルを比較するためにTSQL技術を使用する可能性が最も高いです。

    Developing…

    データベースを開発する過程で、多くのテーブルが比較されます。 たとえば、すべてのテーブル値関数には、考えられるすべてのテスト状況下で行うべきだと思うことを確実にするテストハーネスが必要であり、過去にテス すべてのストアドプロシージャは、実行するプロセスが意図したとおりに正確に実行され、それ以外は何もしないことを確認するためのテス

    ビルドアクティビティがかなりのんびりしていた時期がありましたが、夜間のビルドと統合テストがある場合は、それを完全に自動化し、雑用を

    ETL

    システムへのデータのロードを自動化する場合、多くの場合、さまざまな条件をテストする必要があります。 新しい行を挿入するだけでなく、行の既存のバージョンを更新する必要がありますか? 重複したエントリを防止したり、既存のエントリを削除したりするためのトラップが必要ですか?

    テストデータの設定。

    この記事のスクリプトはすべて、venerable PUBSデータベースのテーブルを使用しています。 Authorsテーブルを使用しますが、もう少し現実的なサイズを得るために、行数を5000に少し強化します。 私は記事でテーブルのソースを提供しました。

    I then created a copy of the table …

    1
    2
    3
    4
    5
    6

    SELECT * INTO authorsCopy
    FROM authors
    GO
    ALTER TABLE dbo.authorsCopy制約Pk_Authorscopyプライマリキーを追加CLUSTERED
    (au_id)ON PRIMARY
    GO

    そして、いくつかの行を変更しました。/div>

    1
    2
    3
    4
    1
    2
    3
    4

    だから今、二つのテーブルは、アドレスフィールドにいくつかのマイナーな変更で主に同じでなければなりません

    テスト テーブルが異なるかどうかを確認する。テーブルが同じかどうかを知りたいだけの場合があります。

    この例は、TVFが正しい結果を持つ既存のテーブルの結果と比較することによって、TVFが正常に動作していることを確認することです。 これを行う通常の方法は、SQL Serverの関数のCHECKSUM()グループを使用することです。

    チェックサムの使用

    BINARY_CHECKSUM 関数を使用して、テーブルが同じかどうかを確認できます。 それは速いですが、私は一瞬で実証しますように、それは、完璧ではありません。 たとえば、一連のテストがある場合は、一般的には十分です。/div>

    1
    2
    3
    4

    iv これを機能させるには、テーブルにTEXT, NTEXT, IMAGE or CURSOR SQL_VARIANT)を基本型として使用しては 今日では、これはますますまれですが、何らかの複雑さがある場合は、サポートされていない型のいずれかを持つ列をサポートされている型に強制するこ 実際には、私は一般的にメタデータをチェックし、これを自動的に行うルーチンを使用しますが、それはきれいではありません。

    作業バージョンでは、特にデータ型の明示的な強制を行う必要がある場合、または特定の列だけをチェックしている場合、

    BINARY_CHECKSUM() CHECKSUM()CommonWordsというテーブルに含まれている英語の一般的な単語を見て示します。. あなたはそれらすべてが異なるチェックサムを持っていることを期待しますが、そうではありません。/div>

    1
    2
    3
    4
    /div>

    (binary_checksum(*))

    authorscopyから)
    select’彼らはおそらく同じです’
    else
    select’彼らは異なっています’
    1
    2
    3
    4
    1
    2
    3
    4
    div>

    select binary_checksum(string)
    from commonwords
    group by binary_checksum(string)
    having count(*)>2)
    BINARY_CHECKSUM(string)による順序

    …結果を与える…

    この情報を武器に、異なる文字列が同じチェックサムを持つことができることをすぐに実証することができます

    select binary_checksum(‘これは非常に次のように見えます’),
    binary_checksum(‘これは非常に次のように見えます’),
    1
    2
    3
    select binary_checksum(‘オタクをリード’),
    binary_checksum(‘巣を訴えた’),
    BINARY_CHECKSUM(‘stud the oust’)

    All these will; have the same checksum, as would …

    1
    2
    3

    SELECT
    BINARY_CHECKSUM(‘accosted guards’),
    BINARY_CHECKSUM(‘accorded feasts’)

    …./div>

    1
    2
    3

    td>

    select binary_checksum(‘これは非常に次のように見えます’),
    binary_checksum(‘これは非常に次のように見えます’),
    binary_checksum(‘これは非常に次のように見えます’)
    1
    2

    ———– ———– ———–
    -447523377 -447522865 -447654449

    The sister function CHECKSUM()

    1
    2
    3
    4

    SELECT CHECKSUM(‘This looks very much 次のように見える’),
    CHECKSUM(‘これは非常に次のように見える’),
    CHECKSUM(‘これは非常に次のように見える’)

    …現在の照合を使用しており、データベースの照合は大文字と小文字を区別しないため、それらはすべて同じであることがわかります。 CHECKSUM()は、文字列比較で等しい場合、チェックサムで等しい文字列を見つけることを目的としています。

    1
    2
    ———– ———– ———–
    -943581052-943581052-943581052

    だから、あなたが言うことができる最高のは、テーブルが同じになる強い可能性があるということですが、絶対に確

    テキスト文字列の場合の違いを気にしない場合は、CHECKSUM()BINARY_CHECKSUM()

    この手法の大きな価値は、必要なチェックサムを計算したら、元のテーブルを必要とするのではなく、テーブルの列に値として格納できることです。より少ない時間。 によって返されたチェックサム値を格納する場合CHECKSUM()同じ照合で生成されたチェックサムでライブテーブルをチェックしてください。

    以下は’what’s changed’ルーチンの簡単な例です。/div>

    1
    2
    3
    4

    –select intoを使用して’チェックサム’テーブルを’オンザフライ’で作成します。

    SELECT
    au_id,
    BINARY_CHECKSUM(au_id,au_lname,au_fname,phone,,city,,zip,)AS
    INTO auchk
    from authorscopy
    ORDER BY au_id
    /*今、私たちは宝くじに勝っていないことを確認するために制約を入れます(非常にそうではありませんが、完全に不可能ではありません同じチェックサムを持つ2つの行があります)*/
    alter table auchk add constraint ISITUNIQUE UNIQUE()
    update authorscopy set au_fname=’arthur’
    where au_id=’327-89-2366′
    select authorscopy。*
    FROM authorscopy
    INNER JOIN AuChk ON authorscopy.au_ID=AuChk.au_ID
    WHERE <>BINARY_CHECKSUM(authorscopy.au_id, au_lname, au_fname, phone, , city, , zip, )
    1
    2
    3
    4

    …which gives…

    1
    2
    3

    au_id au_lname au_fname phone address city state zip contract
    ———– ——— ——— ———— ————— ————- —– —– ——–
    327-89-2366 Mendoza Arthur 529275-5757 15 Hague Blvd. 98949 1の小さな岩

    そして、私たちはちょうど片付けます。/div>

    更新authorscopy set au_fname=’arnold’
    where au_id=’327-89-2366′
    ちろん、トリガーを使用することもできますが、トリガーをテーブルに侵入させることなく、変更の毎日または毎週のレポートが必要な場合もあります。

    Xmlの使用

    一般的な可能性の1つは、データ型を文字列に変換するため、2つのテーブルのXMLバージョンを比較することです。 これは、チェックサムアプローチよりも遅いが、より信頼性があります。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    IF CONVERT(VARCHAR(MAX),(
    SELECT *
    FROM authors ORDER BY au_id FOR XML path, root))
    =
    CONVERT(VARCHAR(MAX),(
    SELECT *
    FROM authorscopy ORDER BY au_id FOR XMLpath, root))
    SELECT ‘they are the same’
    ELSE
    SELECT’they are different’

    ここでは、照合順序を指定して比較のタイプを指定できます。または、テーブル内のデータを比較してこれを行うことができます。.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    IF BINARY_CHECKSUM(CONVERT(VARCHAR(MAX),(
    SELECT *
    FROM authors ORDER BY au_id FOR XML path, root)))
    =
    BINARY_CHECKSUM (CONVERT(VARCHAR(MAX),(
    SELECT *
    FROM authorscopy ORDER BY au_id FOR XML path, root)))
    SELECT’they are pretty much the same’
    ELSE
    SELECT’they are different’SELECT’they are different’

    …テーブルのXMLバージョンのチェックサムを計算することによって。 これにより、比較しているテーブルのチェックサムを保存できます。

    テーブル内の相違点を見つける

    最も簡単なタスクは、テーブルの行数が同じで、テーブル構造が同じであることです。 場合によっては、どの行が異なっていて、どれが欠けているかを知りたい場合があります。 もちろん、特に2つのテーブルに異なる列がある場合は、「同じ」の意味を指定する必要があります。 比較を行う方法は、一般的にこれらの詳細によって決定されます。

    UNION ALL…group BY technique

    テーブルを比較する古典的なアプローチは、比較する列を含むUNION ALLSELECTGROUP BYGROUP BYに一意の値を持つ列が必要であり、主キーはこれに理想的です。 どちらのテーブルも重複は許可されません。 行の数が異なる場合、これらは違いとして表示されます。/div>

    1
    2
    3
    4
    1
    2
    3
    4
    /div>

    div>

    (
    au_idを選択
    から
    (
    au_id、au_lname、au_fname、電話、住所、都市、州、郵便番号、契約を選択
    著者から
    union all
    AU_id、au_lname、au_fname、電話、住所、都市、州、zip、契約を選択します
    authorsCopyから)BothOfEm
    AU_id、au_lname、au_fname、電話、住所、都市、州、zip、契約によるグループ
    カウント(*)を持つ<2)f

    テーブルの1つに重複がある場合、ここでは非常に異なる2つのテーブルがあり、結果が同じであることがわか このため、主キーを構成する列を含め、行を一度だけ含めることをお勧めします。/div>

    1
    2
    3
    4
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    19
    19
    19
    19
    19
    19
    19
    19
    19
    19
    19
    19
    19

    20
    21
    22
    23
    Address_ID,TheAddress,ThePostCode

    から
    (
    (9,’929オーガスティンレーン、定番ヒ区南英国グロスターシャー’,’BS16 4LL’),
    (10,’45Bradfield道Parwich英国ダービーシャー’,’DE6 1QN’)
    )TableA(Address_ID,TheAddress,ThePostCode)
    EUのすべての
    を選択しAddress_ID,TheAddress,ThePostCode
    から
    (
    (8は、”Pippins”は、20グロスター Pl Chirton区タイン&アンプ; Wear UK’,’NE29 7AD’),
    (8, ”’The Pippins”, 20 Gloucester Pl, Chirton Ward, Tyne &amp; Wear UK’,’NE29 7AD’),
    (9, ‘929 Augustine lane, Staple Hill Ward South Gloucestershire UK’,’BS16 4LL’),
    (10, ’45 Bradfield road, Parwich Derbyshire UK’,’DE6 1QN’)
    ) TableB(Address_ID,TheAddress,ThePostCode)
    )f
    GROUP BY Address_ID,TheAddress,ThePostCode
    HAVING COUNT(*)<2

    … giving …

    1

    2

    3
    4
    ———– ———– ————————- ————

    (0row(s)affected)

    この手法は、複数のテーブルを比較するために使用できます。 すべてのテーブルに含まれていない行だけをフィルタリングするには、UNION ALLHAVINGEXCEPTを使用できるようになりました。/div>

    select*from authors
    except
    select*from authorscopy

    これは、authorscopyに見つからないauthorsのすべての行を表示します。 それらが同じ場合、行は返されません

    au_id au_lname au_fname電話アドレス都市州zip契約

    ———– ———– ——— ———— ————————– ———– —– —– ——–

    041-76-1076Sosa Sonja000-198-8753 29Second Avenue Omaha CT23243 0
    187-42-2491Mc Connell Trenton0003090766 279Hague Way San Diego NY94940 1
    220-43-7067Fox Judith000-137-9418 269East hague street richmond va55027 0
    505-28-2848Hardy Mitchell001-2479822 73green milton drive norfolk wa69949 1
    697-84-0401Montes Leanne000-018-0454 441east oak parkway san antonio md38169 1
    727-35-9948Long Jonathon000-8761152 280Nobel Avenue Anchorage la null1
    875-54-8676stone keisha000-107-1947 763White Fabien Way Fremont ND08520 0
    884-64-5876Keller Steven000-2787554 45White Nobel Boulevard Milwaukee NY29108 1
    886-75-9197Ellis Marie001032-5109 35East Second Boulevard Chicago IL32390 1
    975-80-3567Salazar Johanna001-028-0716 17new boulevard jackson nd71625 0
    (10行(S)影響を受けます)
    1
    2
    3
    1
    2
    3
    3
    3
    3
    3
    3
    3
    3

    私はSelect*を使用しているだけです。 通常、比較するすべての列を箇条書きにします。これは、著者が余分な行を持っていた場合、authorsCopyにないAuthorsの行が返されるため、それらが異なっていたと言うため、同じ行数のテーブルでのみ機能します。 これは、EXCEPTEXCEPTオペランド右のクエリからも見つからない

    これは、うまくいけば、私が意味することを示しています

    EXCEPTEXCEPTEXCEPT
    3
    4
    5
    6
    7
    8
    9
    10
    11

    121314151617181919191919191919191919191919191919191919191919/div>

    SELECT Address_Id,TheAddress,ThePostCode

    FROM
    (VALUES
    (9,’929Augustine lane,Staple Hill Ward South Gloucestershire UK’,’BS16 4LL’),
    (10,’45Bradfield road,Parwich Derbyshire UK’,’DE6 1QN’)
    )TableA(Address_Id,TheAddress,ThePostCode div>

    select address_ID,theaddress,thepostcode FROM
    (values
    (8,”‘The Pippins”,20GLOUCESTER PL,CHIRTON ward,tyne&Wear Uk’,’NE29 7AD’),
    (8,”‘The Pippins”,20GLOUCESTER Pl,Chirton Ward,Tyne& Wear UK’,’NE29 7AD’),
    (9, ‘929 Augustine lane, Staple Hill Ward South Gloucestershire UK’,’BS16 4LL’),
    (10, ’45 Bradfield road, Parwich Derbyshire UK’,’DE6 1QN’)
    ) TableB(Address_ID,TheAddress,ThePostCode)

    …yields …

    1
    2
    3
    4

    Address_ID TheAddress Thepostcode
    ———– ———————————————- ———–
    (0行の影響を受けます)

    。..一方。../div>

    1
    2
    3
    4

    20Gloucester Pl,Chirton Ward,Tyne&Wear UK’,’NE29 7AD’),

    (8,”‘The Pippins”,20Gloucester Pl,Chirton Ward,Tyne&Wear UK’,’NE29 7AD’),
    (8,”‘The Pippins”,20Gloucester Pl,Chirton Ward,Tyne&Wear UK’,’NE29 7AD’),
    (8,”‘The Pippins”,20Gloucester Pl,Chirton Ward,Tyne&&

    wear uk’,’ne29 7ad’),

    (9,’929Augustine Lane,Staple Hill Ward South Gloucestershire uk’,’bs16 4ll’),
    (10,’45BRADFIELD road,parwich derbyshire uk’,’de6 1Qn’)
    )Tableb(Address_Id,theaddress,thepostcode
    FROM
    (VALUES
    (9,’929Augustine lane,Staple Hill Ward South Gloucestershire UK’,’BS16 4LL’),
    (10,’45Bradfield road,Parwich Derbyshire UK’,’DE6 1QN’)
    )TableA(Address_Id,TheAddress,THEPOSTCODE)
    1
    2
    3
    4

    。.results in …

    1
    2
    3
    4
    5

    Address_ID TheAddress ThePostCode
    ———– ————————————————————- ———–
    8 ‘The Pippins’, 20 Gloucester Pl, Chirton Ward, Tyne & Wear UK NE29 7AD
    (1 row(s) affected)

    EXCEPTTableATableB内に含まれていることを確認したい場合に有利に使用できます。 したがって、テーブルの行数が異なる場合でも、それらを比較することができます。すべての列を比較したくない場合があります。

    すべての列を比較したくない場合があります。 「同一性」を判断するために、比較する列を常に指定する必要があります。 たとえば、アドレスのみを比較したい場合は、…

    1
    2
    1
    2
    1
    2
    div>3
    著者からアドレスを選択
    except
    authorscopyからアドレスを選択

    外部結合テクニック

    外部結合の技術もあります。 これは、追加の設備を提供するより一般的な手法です。 たとえば、full outer joinを使用すると、どちらのテーブルでも一致しない行を取得できます。 これにより、データの変更の「前」と「後」のビューが表示されます。 より一般的には、同期でどの行を削除、挿入、更新するかを指示するために使用されます。

    We’ll just use the technique to get the altered rows in authorsCopy

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    SELECT authors.au_id, authors.au_lname, authors.au_fname, authors.phone, authors.address, authors.city, authors.state, authors.zip, authors.契約
    著者から
    左外部結合authorsCopy
    authors.au_id=AuthorsCopy.au_id
    およびauthors.au_lname=authorsCopy.au_lname
    およびauthors.au_fname=authorsCopy.au_fname
    およびauthors.au_fname=authorsCopy.au_fname
    およびauthors.au_fname=authorsCopy.au_fname
    およびauthors.au_fname=authorsCopy.au_fname
    およびauthors.au_fname=authorsCopy.au_fname
    電話=authorsCopy。電話
    と合体(著者。アドレス、”)=COALESCE(authorsCopy.アドレス、”)
    とCOALESCE(著者。都市、”)=合体(authorsCopy.市,”)
    とCOALESCE(authors.state,”)=COALESCE(authorsCopy.状態,”)
    とCOALESCE(著者.zip,”)=COALESCE(authorsCopy.zip,”)
    と著者。契約=authorsCopy。あなたが見ることができるように、このアプローチではnull列には困難がありますが、他のものと同じくらい速く、比較のためのより汎用性があります。

    テーブル間の違いを見つける

    どの列と行が変更されたかを簡単に確認する方法が必要な場合があります。 これを行う非常に独創的な方法が最近出版されました。 XMLを使用しました。 「Xmlを使用してテーブルを比較し、データをピボットすることで相違点を報告する」(編集者注:リンク非推奨)。 それは賢いですが、遅すぎます。 同じことは純粋にSQLで行うことができます。 基本的には、キーと値のペアを使用して、主キーに基づいてデータの列ごとの比較を実行します。 一度にテーブル全体を実行すると、かなり遅くなります:最良のトリックは、違いがあることがわかっている行でのみこれを行うことです。/div>

    1
    2
    3
    4
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    19
    19
    19
    19
    19
    19
    19
    19
    19
    19
    19
    19
    19

    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    39
    39
    39
    39
    39
    39
    39
    div>

    34

    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47

    48

    49
    49
    49
    49
    49
    49
    49
    49
    49
    49
    49
    49
    49
    49

    63

    64
    @temp table(au_id varchar(11)primary key)/*これは変更された行の主キーを保持します*/

    insert INTO@Temp(au_id)-変更された行を決定する
    SELECT au_id
    FROM-私たちのテストで最も速いEXCEPTテクニックqhichを使用してください
    (
    SELECT au_id,au_lname,au_fname,phone,,city,state,zip,
    from authors
    EXCEPT
    SELECT au_id,au_lname,au_fname,phone,,city,state,zip,
    from authors
    SELECT au_id,au_lname,au_fname,phone,,city,state,zip,
    FROM authors
    SELECT au_id,au_lname,au_fname,phone,,city,state,zip,
    FROM authors
    、電話、住所、都市、州、郵便番号、契約
    from authorscopy
    )f-変更された列を選択するだけです
    select lefthand.au_id,lefthand.name、左辺。元の値、右辺。value AS changed
    FROM(–データの文字列バージョンを使用して、二つのテーブルをキー値のペアとしてレイアウトします
    SELECT authors.au_id,’au_lname’AS’name’,au_lname AS’value’
    FROM authors INNER JOIN@Temp altered ON altered.au_id=authors.au_id
    UNION
    SELECT authors.au_id,’au_fname’AS’name’,au_fname as’value’
    from authors inner join@temp altered on altered.au_id=authors.au_id
    UNION
    select authors.au_ID,’phone’,phone
    from authors inner join@temp ALTERED on ALTERED.au_id=authors.au_id
    SELECT authors.au_ID,’phone’,phone
    from authors inner join@temp ALTERED on ALTERED.au_id=authors.au_id
    UNION
    SELECT authors.au_id,’address’,address
    FROM authors INNER JOIN@Temp altered ON altered.au_id=authors.au_id
    UNION
    SELECT authors.au_id,’City’AS’name’,City AS’value’
    FROM authors INNER JOIN@Temp altered ON altered.au_id=authors.au_id
    FROM authors INNER JOIN@Temp altered ON altered.au_id=authors.au_id
    FROM AUTHORS INNER JOIN@Temp altered ON altered.au_id=authors.au_id
    union
    select authors.au_id,’state’,state
    from authors inner join@temp altered on altered.au_ID=AUTHORS.au_id
    union
    select authors.au_id,’state’,state
    from authors inner join@temp altered on altered.au_ID=AUTHORS.au_id
    union

    au_id,’zip’,zip

    FROM authors INNER JOIN@Temp altered ON altered.au_id=authors.au_id
    UNION
    SELECT authors.au_id,’contract’,CONVERT(CHAR(1),contract)
    FROM authors INNER JOIN@Temp altered ON altered.au_id=authors.au_id)LeftHand
    INNER JOIN(
    SELECT authorsCopy.au_id,’au_lname’as’name’,au_lname AS’VALUE’
    from authorscopy inner join@temp altered on altered.au_id=authorscopy.au_id
    union
    authorscopyを選択します。au_id,’au_fname’,au_fname
    FROM authorsCopy INNER JOIN@Temp altered ON altered.au_id=authorsCopy.au_id
    UNION
    SELECT authorsCopy.au_id,’phone’,phone
    FROM authorsCopy INNER JOIN@Temp altered ON altered.au_id=authorsCopy.au_id
    UNION
    authorsCopyを選択します。au_id,’address’,address
    from authorscopy inner join@temp altered on ALTERED.au_id=authorscopy.au_id
    union
    authorscopyを選択します。au_id,’City’AS’name’,City AS’value’
    FROM authorsCopy INNER JOIN@Temp altered ON altered.au_id=authorsCopy.au_id
    UNION
    SELECT authorsCopy.au_id,’State’,state
    FROM authorsCopy INNER JOIN@Temp altered ON altered.au_id=authorsCopy.au_id
    UNION
    authorsCopyを選択します。au_id,’Zip’,zip
    from authorscopy inner join@temp ALTERED on altered.AU_id=authorscopy.au_id
    union
    authorscopyを選択します。au_id,’contract’,CONVERT(CHAR(1),contract)
    from authorsCopy INNER JOIN@Temp altered ON altered.au_id=authorsCopy.au_id)rightHand
    on lefthand.au_id=righthand.au_id
    およびlefthand.name=righthand.name
    ここで、左辺。値<>右辺。値

    この例では、これは次のようになります:/div>

    1
    2
    3
    4
    1
    2
    3
    4
    /div>

    ———– ——– —————————- ————————————

    041-76-1076アドレス29Second Avenue9Second Avenue
    187-42-2491アドレス279Hague Way79Hague Way
    220-43-7067住所269East Hague Street69East Hague Street
    505-28-2848住所73Green Milton Drive3Green Milton Drive
    697-84-0401住所441East Oak Parkway41East Oak Parkway
    727-35-9948住所280Nobel Avenue80Nobel Avenue
    875-54-8676住所763White Fabien Way63White Fabien Way
    884-64-5876住所45White Nobel Boulevard5White Nobel Boulevard
    886-75-9197住所35east second boulevard5East Second Boulevard
    975-80-3567住所17new boulevard7new boulevard

    この手法は、行内の差分を比較して表示できるように、差分があるテーブルの行をEntity-attribute-value(EAV)テーブルに回転させます。 この回転は、各列の名前と文字列値をUNIONで行います。 この手法は、多数の相違点がない場合に最適です。

    結論

    テーブルや結果のデータを比較する単一の理想的な方法はありません。 技術の数の一つは、任意の特定のタスクのための最も関連性があります。 それは正確にあなたが必要とする答えおよび仕事のタイプにすべてある。 テーブルが変更されていないことを簡単に確認する必要がありますか、または変更が何であるかを正確に知る必要がありますか? SQLはこのタスクを実行するのが当然高速であり、テーブルと結果の比較は多くのデータベース開発者にとって馴染みのあるタスクです。一般的なルールがある場合、探索的またはアドホックな作業にはSQL Data Compareなどのツールが必要ですが、データベース内のルーチンプロセスには手作業のSQL技術が必

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です