1

カーソルなどでテーブルを反復処理するよりもセットロジックを使用したいのですが、それが必要な場合は実行できます。

基本的に、BI の他の場所で使用されるストアド プロシージャのビューを準備しています。現在、ストアド プロシージャは、適切な量の結合やその他のランダム ロジックを使用して、さまざまなテーブルからプルする select ステートメントにすぎません。

以下は、テーブルがどのように見えるかの例です。1 つ目は返されるテーブル、2 つ目はユーザーが実行したい除外です。 例

除外テーブルの各レコードを確認し、それをフィルターとして最初のテーブルに適用して、アイテムが一致するすべての行を削除したいと考えています。(彼らは LocationCode 全体を削除することを選択でき、それがすべての WarehouseCode とその下のすべてをカスケードする可能性があるため、今後はもう少し複雑になります。これは基本的に階層です。しかし、一般的な考え方を理解したいと思います)。

行ごとに移動する必要があるため、NOT EXISTS でそれを行う方法がわかりませんでした。カーソルを使用する必要があるのか​​、別の方法で反復する必要があるのか​​ わかりません。私が気付いていないSQLに別のツールがあるかどうか疑問に思っています。

別のテーブルの値に基づいて行を効率的に削除する方法についての提案をいただければ幸いです。

4

3 に答える 3

1

Table2 に類似する行を除いて、Table1 から行全体を取得する場合は、次のようにします。

select * -- Column list here
from Table1 as t
where
    not exists (
        select t.LocationCode, t.WarehouseCode, t.WarehouseName, t.StorageAddress
        intersect
        select t2.LocationCode, t2.WarehouseCode, t2.WarehouseName, t2.StorageAddress
        from Table2 as t2
    )

またはより便利

select * -- Column list here
from Table1 as t
where
    not exists (
        select *
        from Table2 as t2
        where
            t2.LocationCode = t.LocationCode and
            t2.WarehouseCode = t.WarehouseCode and
            t2.WarehouseName = t.WarehouseName and
            t2.StorageAddress = t.StorageAddress
    )
于 2013-10-01T13:55:43.933 に答える
0

ここで解決すべきことが 2 つあります。最初のケースでは、除外テーブルには実際のテーブルと同じ数の列があると説明しました。ここでは、このテーブルの一部の列は「NULL 可能」であり、一部はそうでない可能性があると想定しています。そのため、除外中はそれにも注意する必要があります。パフォーマンス上の理由から、「左結合」はここで使用するのに適した候補であり、必要な場合にのみ選択した列で MATCHING を実行できます。あなたのケースでは、すべての列が一致する必要があるように見えますが、将来、Identity/datetime/timestamp のような列がテーブルに追加されたかどうかを考えてください。以下のコードを参照してください。このテーブル内のデータの量が多い場合、適切な非クラスター化および/またはフィルター インデックスを使用するとパフォーマンスが向上しますが、ビュー クエリが遅い場合は後の段階になります。

あなたが言及した2番目の部分については、後で場所コードを完全に除外することを決定する可能性があり、階層的な依存関係があります。正確な要件があるまで、これを別にしておくといいでしょう。

    DECLARE @AllData TABLE
    (
        ID      INT         NOT NULL PRIMARY KEY
        ,FName  sysname     NOT NULL
        ,LName  sysname     NOT NULL
        ,MName  sysname     NULL
    )

    DECLARE @ExcludeData TABLE
    (
        ID      INT         NOT NULL PRIMARY KEY
        ,FName  sysname     NOT NULL
        ,LName  sysname     NOT NULL
        ,MName  sysname     NULL
    )

    INSERT INTO @AllData( ID, FName, LName, MName )
                SELECT 1,'Fname1','Lname1','MName1'
    UNION ALL   SELECT 2,'Fname2','Lname2',NULL
    UNION ALL   SELECT 3,'Fname3','Lname3','Mname3'
    UNION ALL   SELECT 4,'Fname4','Lname4',NULL

    INSERT INTO @ExcludeData( ID, FName, LName, MName )
                SELECT 1,'Fname1','Lname1','MName1'
    UNION ALL   SELECT 2,'Fname2','Lname2',NULL

    SELECT a.ID,a.FName,a.LName,a.MName
    FROM @AllData a
    LEFT JOIN @ExcludeData b
    ON 
        ((a.ID=b.ID) OR (a.id IS NULL AND b.id IS NULL))
        AND
        ((a.FName=b.FName) OR (a.FName IS NULL AND b.FName IS NULL))
        AND
        ((a.LName=b.LName) OR (a.LName IS NULL AND b.LName IS NULL))
        AND
        ((a.MName=b.MName) OR (a.MName IS NULL AND b.MName IS NULL))
    WHERE 
        (b.ID IS NULL AND b.FName IS NULL AND b.LName IS NULL AND b.MName IS NULL)
于 2013-10-01T14:14:08.993 に答える
0

EXCEPTと同様に機能する句を調べます。UNION

select col1, col2, col3 from yourtable
EXCEPT
select col1, col2, col3 from exceptions
于 2013-10-01T13:44:35.447 に答える