从SQL表中删除,其中从应用于另一个表的条件中找到ID

时间:2015-09-27 15:43:15

标签: sql-server join sql-delete

首先,我不知道标题是否正确,但让我告诉你我想要什么,我会按照建议更正。 所以,我有两张桌子:

  • 表1
    • ID,subid,name
  • 表2
    • ID

我想要的是删除table2IDsubid等于table1 table1.name的任何元素,其中table1等于指定值

如果我在ID subid name 1 ... 1 ...... name1 2 ... 3 ...... name2 3 ... 2 ...... name1 4 ... 1 ...... name2

中有这些元素
table2

以及ID 1 2 3 4

中的这些行
table2

我想删除DELETE FROM table2 WHERE ID = (SELECT subid FROM table1 WHERE NAME = "name1") 中ID = subid的元素,当name = name1 时,这意味着元素1和2.

类似的东西:

RelativeLayout child = (RelativeLayout) findViewById(R.id.work_list); //new child

这可能吗?

2 个答案:

答案 0 :(得分:5)

你非常接近。

您只需要= ANY而不是=,因为子查询可以返回多行SQL Fiddle

DELETE 
FROM table2
WHERE  ID = ANY (SELECT t1.subid
                 FROM   table1 t1
                 WHERE  t1.name = 'name1') 

虽然这通常使用IN

表达
DELETE 
FROM table2
WHERE  ID IN (SELECT t1.subid
              FROM   table1 t1
              WHERE  t1.name = 'name1') 

我对您发布的查询进行了其他一些更改...

  1. 我始终确保子查询中的列引用使用两个部件名称来避免unfortunate surprises
  2. 您应该使用单引号来分隔字符串文字,以便它在默认QUOTED_IDENTIFIER设置下工作,并且不会被解释为引用名为name1的列。

答案 1 :(得分:1)

你也可以使用连接删除,所以我们很有可能。

您可以先使用以下方式识别(将要)删除的记录:

select t2.*
from table2 t2
inner join table1 t1 on t2.id = t1.subId
    and  t1.name = 'whatever'

然后执行删除:

delete t2
from table2 t2
inner join table1 t1 on t2.id = t1.subId
   and t1.name = 'whatever'

@eckes看到我用我正在使用的语法的小提琴:http://sqlfiddle.com/#!6/260a5