2013-03-20 5 views
12

Я хочу удалить из таблицы в зависимости от данных, которые существуют в другой таблице, которая ссылается на первую, однако у меня есть код, который работает, и показывает значение, которое будет удалено, когда я запускаю его как SELECT stetement , однако, когда я меняю это на DELETE, он дает мне ошибки, и я не понимаю, почему они там.Удаление с использованием LEFT JOIN

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; 

Ошибка:

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 

Я использую Postgres

+2

использования «H» 'удалить из таблицы, где идентификатор в (вашем запросе на выборку)' – jonasnas

+1

Снимите. * И поставить на УДАЛИТЬ loadCustomer FROM .. .. – Rodolfo

+0

Попробуйте следующее: «DELETE leadCustomer FROM ...» – Arvo

ответ

9

От того, где я вижу, вы на самом деле не нужно присоединиться к этому ...

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

будут удалены все записи в leadcustomer с CUSTOMERID, который: 1) отличается от 8 2) Не в таблице flightbooking со статусом 'R' или 'H'

не то, что вы пытаетесь это сделать?

+0

Вы были правы, мне не нужно было присоединиться. и обработка этой средней строки также работала, однако то, что она делает, присваивается идентификатор, он удаляет эту строку, если у нее нет соответствующих заказов со статусом R или H – Matt

+0

. Это работает, но не IN, не будет использовать индекс customerID (если у вас есть), который может быть больным (отметьте Комментарии в этом http://stackoverflow.com/questions/652770/delete-with-join-in-mysql) – zzarbi

-3

Удалить .* Из leadCustomer.* т.е.

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 не поддерживает 'LEFT JOIN', который ссылается на' DELETE'. – Skrol29

-3

вы можете попробовать это

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

Я считаю, что на основе [документации] (http : //www.postgresql.org/docs/9.3/static/sql-delete.html), что 'LEFT JOIN' здесь приведет к синтаксической ошибке. –

+1

PostgreSQL не поддерживает 'LEFT JOIN', который ссылается на' DELETE'. – Skrol29

0

Вам нужно будет сделать это:

Удалить из TableA где ID в (выберите идентификатор из TABLEA левое внешнее соединение TableB б на A.id = b.ID , где b.ID - NULL)

34

ОБРАЗЕЦ. Удаление записи в таблице «А» Есть НЕ ЗАПИСЬ В ТАБЛИЦУ

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

это работает, и это правильный ответ для заголовка – Omu

+3

это не работает в postgres – Trev

+0

Вопрос помечен postgresql, но LEFT JOIN недействителен с DELETE в postgresql. – user9645