2013-03-20 20 views
12

Chcę usunąć z tabeli, w zależności od danych, które istnieją w innej tabeli, która odwołuje się do pierwszej, jednak mam kod, który działa i pokazuje wartość, która ma zostać usunięta po uruchomieniu go jako SELECT stetement jednak gdy zmienię to na DELETE, to daje mi to błędy, których nie rozumiem, dlaczego tam są.Usuwanie przy użyciu LEWEGO DOŁĄCZA

DELETE leadCustomer.* FROM coursework.leadCustomer LEFT JOIN coursework.flightBooking 
ON leadCustomer.customerID = flightBooking.customerID 
WHERE leadCustomer.customerID NOT IN (
SELECT customerID FROM (SELECT customerID, status FROM coursework.flightBooking) AS 
StatusCount where status IN ('R','H') GROUP BY customerID 
) 
AND leadCustomer.customerID = 8; 

błędach:

ERROR: syntax error at or near "leadCustomer" 
LINE 1: DELETE leadCustomer.* FROM coursework.leadCustomer LEFT JOIN... 
      ^

********** Error ********** 

ERROR: syntax error at or near "leadCustomer" 
SQL state: 42601 
Character: 8 

Używam postgres

+2

użyć 'usunąć z tabeli, gdzie id w (swojej kwerendy wybierającej)' – jonasnas

+1

Usuń. * I umieścić na DELETE FROM loadCustomer .. .. – Rodolfo

+0

Spróbuj tego: "DELETE leadCustomer FROM ..." – Arvo

Odpowiedz

9

skąd ja to widzę, nie faktycznie potrzebują dołączyć, aby wykonać to ...

DELETE FROM coursework.leadCustomer 
WHERE leadCustomer.customerID NOT IN (
SELECT distinct customerID FROM coursework.flightBooking where status IN ('R','H') 
) 
AND leadCustomer.customerID = 8; 

będzie usunąć wszystkie rekordy w leadcustomer z customerId czyli: 1) różni się od 8 2) Nie w tabeli flightbooking ze statusem 'R' lub 'H'

Czy nie tego próbujesz to zrobić?

+0

Miałeś rację, nie potrzebowałem połączenia. a neatening tego środkowego rzędu również działał, jednak to, co robi, otrzymuje identyfikator, kasuje ten wiersz, jeśli nie ma powiązanych rezerwacji o statusie R lub H – Matt

+0

Działa to jednak NIE, nie będzie używać indeksu customerID (jeśli masz), co może być uciążliwe (Sprawdź komentarze w tym http://stackoverflow.com/questions/652770/delete-with-join-in-mysql). – zzarbi

-3

Usuń .* Od leadCustomer.* tj:

DELETE leadCustomer FROM coursework.leadCustomer LEFT JOIN coursework.flightBooking 
ON leadCustomer.customerID = flightBooking.customerID 
WHERE leadCustomer.customerID NOT IN (
SELECT customerID FROM (SELECT customerID, status FROM coursework.flightBooking) AS 
StatusCount where status IN ('R','H') GROUP BY customerID 
) 
AND leadCustomer.customerID = 8; 
+1

PostgreSQL nie obsługuje 'LEFT JOIN', które odnosi się do' DELETE'. – Skrol29

-3

można spróbować to

DELETE leadCustomer FROM coursework.leadCustomer lc 
LEFT JOIN coursework.flightBooking fb ON lc.customerID = fb.customerID 
and status IN ('R','H')and fb.customer_id is not null 
WHERE leadCustomer.customerID = 8; 
+0

Wierzę, na podstawie [dokumentacja] (http : //www.postgresql.org/docs/9.3/static/sql-delete.html), że "LEFT JOIN" tutaj spowoduje błąd składni. –

+1

PostgreSQL nie obsługuje 'LEFT JOIN', które odnosi się do' DELETE'. – Skrol29

0

Trzeba będzie to zrobić:

Usuń z TableA gdzie ID w (wybrać identyfikator z TABLEA lewe sprzężenie zewnętrzne tableB b na a.ID = b.ID gdzie b.ID ma wartość NULL)

34

PRÓBKA. Usuń rekord w tabeli 'A' JEST TAM SĄ NIE zapisu w tabeli 'h'

DELETE A FROM ARTICULO_ALMACEN A 
LEFT JOIN HISTORICO_UNION H 
ON A.COD_ARTICULO = H.COD_ARTICULO 
AND A.COD_ALMACEN = H.COD_ARTICULO_ALMACEN 
AND A.TPROPIEDAD1 = H.PROPIEDAD1 
AND A.TPROPIEDAD2 = H.PROPIEDAD2 
AND A.TPROPIEDAD3 = H.PROPIEDAD3 
WHERE H.COD_ARTICULO IS NULL 
+3

to działa i jest to poprawna odpowiedź dla tytułu – Omu

+3

to nie działa w postgresie – Trev

+0

Pytanie jest oznaczone postgresql, ale LEWY JOIN nie jest prawidłowy z DELETE w postgresql. – user9645

Powiązane problemy