2015-04-28 5 views
2

Мне нужно написать инструкцию удаления для таблицы клиентов. удалите клиентов, которые не добавили никаких заказов. используйте подзапрос и оператор exist.Оператор удаления с подзапросом

У меня возникли проблемы с надлежащим образом, чтобы этот запрос отображался. Это то, что я тестировал, и мне не повезло. Может ли кто-нибудь сказать мне, как исправить это утверждение?

  delete customers from dbo.customers 
     WHERE  (customerID NOT exist 
     (SELECT customerID 
          FROM   dbo.Orders 
          where customerid = ordersid)) 
+1

С СБД, которыми вы владеете? – Bohemian

ответ

1

Вашего синтаксис для использования оператора exist немного смещен, хотя общая идея в правильном направлении:

DELETE FROM dbo.customers 
WHERE  NOT EXISTS (SELECT * 
         FROM dbo.orders 
         WHERE dbo.customers.customer_id = 
           dbo.orders.customer_id) 
1

Я думаю, ваша проблема заключается в ИНЕКЕ вашей подвыборки. Вы сравниваете customId с orderId, который вы, скорее всего, не хотите делать. Попробуйте просто удалить предложение where из подзаголовка, потому что вы хотите убедиться, что customerId не находится в нефильтрованной таблице Orders, и вместо того, чтобы не существовать, не выполните вход. Вы также захотите убедиться, что у вас есть идентификатор клиента, индексированный для оператора, например это.

delete customers from dbo.customers 
where customerID not in (SELECT customerID FROM dbo.Orders) 
0

Я бы пошел со следующим.

DELETE FROM dbo.customers 
WHERE dbo.customers.customer_id not in (
    SELECT dbo.orders.customer_id 
    FROM dbo.orders 
    GROUP BY dbo.orders.customer_id 
) 
0

Следующая ссылка должна быть полезной: http://www.w3schools.com/sql/sql_delete.asp

Хотя, глядя на свой код, следующий оператор должен работать.

Предполагается, что у вас есть таблица клиентов и таблица заказов, а customerid - в обеих таблицах, связывающих клиента с заказом. Каждый заказ будет иметь на нем клиента, поэтому, если клиент в таблице клиента не найден в подзапросе, то у них нет заказов.

delete from dbo.customers t1 
where t1.customerID not in 
(select distinct customerid from dbo.orders) 
1

Вашего синтаксис выключен, но так ваша логика - вам не нужен связанный подзапрос (то есть один, который работает для каждой строки, поскольку он использует значения из строки). Вместо этого просто сделайте следующее:

delete from customers 
where customerID not in (select customerID from orders) 
Смежные вопросы