SQL:根据其他表列从表中选择

时间:2017-02-15 12:04:48

标签: sql sql-server

我已经花了很多时间尝试解决它但无法达成解决方案 以下是我的表格。我想要做的是当PO,SKU,LOC和REC在t1和t2之间匹配时从t1删除而t2.ST是D但是同样的PO,SKU,LOC应该存在于t1中,其中ASN不为空。

t1

PO | SKU| LOC | ASN |REC | allID
a    b    c      e    NULL  NULL
a    b    c      g     g     12

t2

PO |SKU |LOC |ASN   |REC |ST
a    b    c   NULL    g   D

从上面我应该能够删除t1中的第二行,因为在第一行相同的PO,SKU,LOC存在且ASN不为空。

谢谢。

2 个答案:

答案 0 :(得分:1)

对您的问题的字面解释变为两个exists条款:

delete t1
    where exists (select 1 
                  from t2
                  where t2.PO = t1.PO and t2.SKU = t1.SKU and
                        t2.LOC = t1.LOC and t2.REC = t1.REC and
                        t2.ST = 'D'
                 ) and
           exists (select 1
                   from t1 tt1
                   where tt1.PO = t1.PO and tt1.SKU = t1.SKU and
                         tt1.LOC = t1.LOC and tt1.asn is not null
                  );

我并非100%确定这是您真正想要的 - 它会删除匹配的所有行。如果这不是你想要的,那么你应该问另一个问题。这个问题已经有了答案,以一种使答案无效的方式改变问题是很粗鲁的。

答案 1 :(得分:0)

听起来像:

delete from t1
where (t1.po,t1.sku,t1.loc,t1.rec) in 
  (select t2.po,t2.sku,t2.loc,t2.rec
   from t2
   where t2.st = 'D')
and exists (select * from t1 t1_2
            where t1_2.po  = t1.po
            and   t1_2.sku = t1.sku
            and   t1_2.loc = t1.loc
            and   t1_2.asn is not null);