2017-02-08 12 views
0

itemid、storeid、MSRTimeの値がt1になく、itemid、storeid、MSRTimeの値がt3に存在し、ステータスがisである場合、t2から削除します。 D.以下の例では、t2の2番目の行は削除できますが、1番目の行は削除できません。SQL Server:別のテーブルの値に基づいてテーブルから削除

表1:T1

itemid |storeid|MSRTime 
x  y  z 

表2:T2

itemid |storeid|MSRTime 
    x  y  z 
    a  b  c 

表3:T3

itemid |storeid|MSRTime|status 
    x  y  z D 
    a  b  c D 

I参加使用しこれを実行しようとしたが、私は、所望に達することができませんでした結果。助けてください。
ありがとうございます。あなたは、ほとんどのクエリを書くことができます

答えて

1

を行ってもいいですあなたはそれを説明してきたとおりに:

declare @t1 table(itemid varchar(7),storeid varchar(9),MSRTime varchar(3)) 
insert into @t1(itemid,storeid,MSRTime) values 
('x','y','z') 
declare @t2 table(itemid varchar(7),storeid varchar(9),MSRTime varchar(3)) 
insert into @t2(itemid,storeid,MSRTime) values 
('x','y','z'), 
('a','b','c') 
declare @t3 table(itemid varchar(7),storeid varchar(9),MSRTime varchar(3),status varchar(4)) 
insert into @t3(itemid,storeid,MSRTime,status) values 
('x','y','z','D'), 
('a','b','c','D') 

delete from t2 
from @t2 t2 
    inner join 
    @t3 t3 
     on 
      t2.itemid = t3.itemid and 
      t2.storeid = t3.storeid and 
      t2.MSRTime = t3.MSRTime and 
      t3.status = 'D' 
where 
    not exists (
     select * 
     from @t1 t1 
     where t1.itemid = t2.itemid and 
      t1.storeid = t2.storeid and 
      t1.MSRTime = t2.MSRTime 
    ) 

select * from @t2 

結果:

itemid storeid MSRTime 
------- --------- ------- 
x  y   z 
+0

私はこれが私のために働くかもしれないと思います。あなたの助けていただきありがとうございます。私は実際のケースのシナリオでそれをテストするときに答えを受け入れます。 – Amir

+0

ありがとう、それは私の魅力のように働いた。 – Amir

0

この

-- delete t2 
select * 
from table2 t2 
JOIN table3 t3 on t2.itemid = t3.itemid and 
        t2.storeid = t3.storeid and 
        t2.MSRTime = t3.MSRTime 
LEFT JOIN table1 t1 on t2.itemid = t1.itemid and 
         t2.storeid = t1.storeid and 
         t2.MSRTime = t1.MSRTime 
where t1.itemID IS NULL 

のようなものを実行し、それが戻って右の行をあなたを与える場合は、単に非コメントは削除、選択最初にする必要があり、あなたは

0

参考用にスクリプト全体を作成しました。ご使用のシナリオで最後のDELETEクエリを使用してください。それはトリックを行います。これは、ご使用の環境にマッチしますが、プログラム的に参加すると、あなたが比較している結果を制限することが有益であり得る場合

CREATE TABLE #T1 
(itemid VARCHAR(10) 
,storeid VARCHAR(10) 
,MSRTime VARCHAR(10)) 

INSERT INTO #T1 VALUES ('x','y','z') 

SELECT * FROM #T1 

GO 

CREATE TABLE #T2 
(itemid VARCHAR(10) 
,storeid VARCHAR(10) 
,MSRTime VARCHAR(10)) 

INSERT INTO #T2 VALUES ('x','y','z'),('a','b','c') 

SELECT * FROM #T2 

GO 

CREATE TABLE #T3 
(itemid VARCHAR(10) 
,storeid VARCHAR(10) 
,MSRTime VARCHAR(10) 
,status VARCHAR(10)) 

INSERT INTO #T3 VALUES ('x','y','z','D'),('a','b','c','D') 

SELECT * FROM #T3 

GO 

DELETE M 
FROM #T2 AS M INNER JOIN 
(SELECT itemid,storeid,MSRTime FROM 
(SELECT itemid,storeid,MSRTime FROM #T3 WHERE status='D') T1 
INTERSECT 
(SELECT itemid,storeid,MSRTime FROM 
      (SELECT * FROM #T2 
      EXCEPT 
      SELECT * FROM #T1) T2)) X 
ON X.itemid = M.itemid AND X.storeid = M.storeid AND X.MSRTime = M.MSRTime   

GO 
0

わからないだけの状態でDの値を有するもの。また、3つの別々の結合で一致させる必要がないように、Coaleseを使用して複合キーを作成しようとします。例えば

-

itemid |storeid|MSRTime|Key x y z xyz a b c abc

+0

ありがとうございます。しかし、この例は私の問題の一般的な表現でした。私がチェックする必要がある他のフィールドもあります。 – Amir

+0

なぜ単純に結合にAND関数を使用してIEに一致させることができないのですか?DELETE t2 FROM table2 t2 INNER JOIN table1 t1 ON t1.itemid = t2.itemid AND t1.storied = t2.storied AND t1.MSRTime = t2。 MSRTime –

関連する問題