使用子查询删除语句

时间:2015-04-28 22:54:11

标签: sql

我必须为customer表编写一个delete语句。删除未输入任何订单的客户。使用子查询和存在的运算符。

我无法正确显示此查询的方式 这是我测试过的,没有运气。谁能告诉我如何解决这个问题呢?

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

5 个答案:

答案 0 :(得分:1)

使用exist运算符的语法略有偏差,但总体思路是正确的方向:

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

答案 1 :(得分:1)

我认为你的问题在于你的subselect的where子句。您将customId与您最不想做的ordersId进行比较。尝试简单地从subselect中删除where子句,因为你想确保customerId不在未经过滤的Orders表中,而不是不存在不执行。你还需要确保你为一个语句索引了customerID此

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

答案 2 :(得分:1)

您的语法已关闭,但您的逻辑也是如此 - 您不需要相关子查询(即每行运行一个子查询,因为它使用行中的值)。相反,只需这样做:

delete from customers
where customerID not in (select customerID from orders)

答案 3 :(得分: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
)

答案 4 :(得分:0)

以下链接应该是有用的: http://www.w3schools.com/sql/sql_delete.asp

虽然查看了您的代码,但以下声明应该有效。

这假设您有一个customers表和一个订单表,而customerid在两个表中,将客户与订单相关联。每个订单上都有一个customerid,因此如果在子查询中找不到customer表中的customerid,那么他们就没有订单。

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