2014-03-24 2 views
0

내 질문은 SQL DELETE with INNER JOIN과 거의 동일합니다. 하지만 나는 평등하지 않다면 삭제하고 싶다!MISSING 데이터의 내부 조인에서 SQL 삭제

내 간단한 문제 : 2 개의 테이블 bus_stops, bus_routes;

bus_routes {id, bus_route_id,..other columns..} 
bus_stops {id, bus_route_id,..other columns..} 

일부 경로가 삭제되었지만 버스가 멈추고 삭제해야합니다. 의미, 버스 경로가없는 bus_stops 만 삭제해야합니다!

그것은 같은 의미

DELETE bs.* FROM bus_stops AS bs 
INNER JOIN bus_routes AS br 
ON bs.bus_route_id <> br.bus_route_id 

을하지만 위의 코드는 확실히 작동하지 않습니다.

+0

참조 OUTER JOIN은. – Strawberry

답변

3

당신은 작동 쿼리 아래 LEFT JOIN을 사용해야합니다

A는 SQL에 참여
DELETE bs.* 
FROM bus_stops AS bs 
LEFT JOIN bus_routes AS br 
ON bs.bus_route_id = br.bus_route_id 
WHERE br.bus_route_id IS NULL 
+0

감사합니다, Eduardo :) 해결책은 너무 간단해서 놓쳤습니다. :) –

2

먼저 두 테이블의 모든 데카르트 제품입니다. 테이블 A의 모든 레코드가 테이블 B의 모든 레코드와 결합된다는 것을 의미합니다. 그런 다음 조인 조건은 조건과 일치하지 않는 레코드를 제거하여 레코드를 줄입니다.

같지 않음 (<>)이 아닌 내부 조인을 사용하는 경우 최소한 고유 값이 있으면 모든 레코드가 삭제됩니다. 작은 예 : AXB의 데카르트 제품은

Table A | B  Table C | D 
============= ============= 
     | 1    | 1 
     | 2    | 2 

입니다

:

| B | D 
========== 
    | 1 | 1 
    | 1 | 2 
    | 2 | 1 
    | 2 | 2 

지금 값을 선택 B <> C를 사용하는 경우, 결과는 다음과 같습니다

| B | D 
========== 
    | 1 | 2 
    | 2 | 1 

이렇게하면 두 레코드가 모두 삭제됩니다.

해결책으로 외부 조인 또는 하위 쿼리를 시도하십시오.

예 (서브 쿼리) :

DELETE FROM C WHERE NOT EXISTS(SELECT * FROM A WHERE A.B = C.d) 

예 (외부 조인) :

DELETE FROM C LEFT JOIN A ON C.D = A.B WHERE A.B IS NULL 
+1

왼쪽 구속 후 ON 절을 추가해야합니다. –

+0

Ups, 맞습니다. –

+0

감사합니다., 좋은 레슨 :) –

관련 문제