2017-10-27 1 views
3

WHERE 절이 다른 테이블의 값을 기반으로하는 INNER JOIN으로 행을 삭제하려는 테이블이 있습니다. 표 2의 primary_key 표에서 foreign_key 1.mysql은 다른 테이블의 값을 기반으로 행을 삭제합니다.

표 1

table_1_id | customer_id | table_2_id 
----------------------------------------- 
    1  |  5  |  1 
    2  |  5  |  2 
    3  |  5  |  3 

표 2 표 2의 value 동일 여기서 I는 표 1의 행을 삭제할

table_2_id | value 
----------------------- 
    1   |  0 
    2   |  0 
    3   |  1 

0. 따라서이 예제에서 문은 INNER JOIN을 사용하여 두 테이블을 연결하기 때문에 표 1의 처음 두 행을 삭제해야합니다.

나는 이것을 시도했지만 정확히 내가 원하는 것을하지 않았다. 이 명령문은 항상 첫 번째 두 개가 아닌 표 1의 모든 행을 삭제합니다.

DELETE t1 
FROM Table1 t1 
INNER JOIN Table2 t2 ON (t1.table_2_id = t2.table_2_id) 
WHERE t1.customer_id = '5' 
AND t2.value = '0' 
+0

where 절을()에 넣고 무슨 일이 일어나는지보십시오. –

+0

[Fiddle] (http://sqlfiddle.com/#!9/210938/1)에서 잘 작동합니다. –

+0

이 동작을 복제 할 수 없습니다. – Strawberry

답변

3

너무 복잡합니다. 당신은 조건이 충족되는 경우 표 1에서 삭제할 :

delete from t1 where customer_id = 5 and t2_id in (select t2_id from t2 where value = 0); 
+0

나는 단지 해설하는 대신 해답을 넣어야 만했다. -) well done –

+0

OP는 너무 복잡하게 생각하지 않습니다. OP의 솔루션은 설명 된 상황에 전적으로 적합합니다. 그것이 무엇이든간에 '문제'는 다른 곳에 있습니다. – Strawberry

+0

@Strawberry : 하하. 날 잡았어. 나는 OP의 삭제 진술을별로 보지 않았다는 것을 인정해야한다. 테이블에 합류하는 것은 그러한 작업을위한 문제를 복잡하게 만드는 것일 뿐이다. 그러나, 당신 말이 맞아, OP의 삭제 진술뿐만 아니라 작동합니다. 어쩌면 OP가 인식하지 못하는 테이블 2의 레코드가있을 수 있습니다. 하위 쿼리를 별도로 실행하여 쉽게 확인할 수 있습니다. –

0

나는이 동작을 복제 할 수 없습니다 :

DROP TABLE IF EXISTS table1; 

CREATE TABLE table1 
(table_1_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,customer_id INT NOT NULL 
,table_2_id INT NOT NULL 
); 

INSERT INTO table1 VALUES 
(1,5,1), 
(2,5,2), 
(3,5,3); 

DROP TABLE IF EXISTS table2; 

CREATE TABLE table2 
(table_2_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,value TINYINT NOT NULL 
); 

INSERT INTO table2 VALUES 
(1,0), 
(2,0), 
(3,1); 

SELECT * FROM table1; 
+------------+-------------+------------+ 
| table_1_id | customer_id | table_2_id | 
+------------+-------------+------------+ 
|   1 |   5 |   1 | 
|   2 |   5 |   2 | 
|   3 |   5 |   3 | 
+------------+-------------+------------+ 
3 rows in set (0.01 sec) 

SELECT * FROM table2; 
+------------+-------+ 
| table_2_id | value | 
+------------+-------+ 
|   1 |  0 | 
|   2 |  0 | 
|   3 |  1 | 
+------------+-------+ 
3 rows in set (0.00 sec) 

DELETE t1 
FROM Table1 t1 
INNER JOIN Table2 t2 ON t1.table_2_id = t2.table_2_id 
WHERE t1.customer_id = 5 
AND t2.value = 0 
; 

SELECT * FROM table1; 
+------------+-------------+------------+ 
| table_1_id | customer_id | table_2_id | 
+------------+-------------+------------+ 
|   3 |   5 |   3 | 
+------------+-------------+------------+ 
1 row in set (0.00 sec) 

참조하십시오. 잘 작동합니다.

+0

입니다. 나는 내 mysql 데이터베이스에서도 결과를 얻지 못했다. 모든 것이 내 것과 같습니다. –

+0

위의 내용을 시스템에 복사하여 붙여 넣으면 작동하지 않습니다. 실례지만. – Strawberry

관련 문제