2015-09-27 73 views
0

首先,我不知道標題是否正確,但讓我告訴你我想要的內容,然後按照建議更正它。 所以,我有2個表:從SQL表中刪除應用於其他表的條件中找到的ID

  • table1的
    • ID,子編號,名稱
  • 表2
    • ID

我想要的是刪除table2中的任何元素,它們的ID等於subidtable1,其中table1.name等於指定值。

如果我在table1

ID subid name 
1 ... 1 ...... name1 
2 ... 3 ...... name2 
3 ... 2 ...... name1 
4 ... 1 ...... name2 

這些元素和這些行中table2

ID 
1 
2 
3 
4 

我想與ID =子ID,刪除那些元素在table2當名稱= NAME1 ,這意味着要素1和2.

類似於:

DELETE FROM table2 
WHERE ID = (SELECT subid 
      FROM table1 
      WHERE NAME = "name1") 

這可能嗎?

回答

1

你也可以使用連接刪除,所以yup很有可能。

可以識別(是)刪除的記錄先用:

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

+0

@eckes,您對我的帖子的編輯是無效的語法。 – Kritner

+0

你有2'從'那不起作用 – eckes

+1

@eckes它呢,看看我貼的小提琴。這是有效的語法 – Kritner

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的列。
+0

你也可以使用MAX(t1.subid)來避免設置操作。 – eckes

+0

@eckes - 這將改變語義。它會最終刪除行'ID = 2'不'ID IN(1,2)' –

+0

是的,它只適用於單擊一次預計 – eckes