获取不在订单中的产品说明

时间:2013-10-09 20:46:37

标签: sql tsql

  • 有一个Products的表格p_nop_desc
  • order_details的表格p_no(与上述相同)。

我需要p_desc,其中products.p_no不在order_details

注意:我做了很多搜索,这就是我想出的结果。

-- Why would this work?
select p_desc from products
except
select p_no from order_details

-- Then,
select p_desc from products
where products.p_no not in order_details.p_no

-- and finally,
select p_desc from products
where (p_no not in (select p_no from order_details))

这些都对吗?有人告诉我使用except,但我没看到第一个语句是如何比较p_no属性的,所以我假设这是错误的。

2 个答案:

答案 0 :(得分:1)

因为这是作业,所以我不打算拼出来。

  

//为什么会这样?   从产品中选择p_desc
  除了
  从order_details中选择p_no

请参阅:http://technet.microsoft.com/en-us/library/ms188055.aspx
提示:以下代码是等效的:

SELECT p.p_desc FROM products p
LEFT JOIN order_details o ON (o.p_no = p.p_no)
WHERE o.p_no IS NULL
  

//然后,
  从产品中选择p_desc
  products.p_no不在order_details.p_no

看起来像语法错误。

  

//最后,
  从产品中选择p_desc
  where(p_no not in(从order_details中选择p_no))

看起来不错,我发现这个最容易理解。

关于微软EXCEPT 的评论 虽然我可以看到易用性参数,但使用这样的代码会使代码很难移植到另一个平台 我建议更接近SQL-92的核心,并在上一个声明中使用该表单 它将使你成为一个更全面的程序员并防止锁定到一个平台,这对于就业前景来说只会是一件好事。

从功能的角度来看,代码示例A与样本C相比没有任何好处,两者都需要相同的运行时间。

答案 1 :(得分:0)

最干净的方法是使用NOT EXISTS。我刚才在这里回答了类似的问题:

https://dba.stackexchange.com/questions/51270/get-unmatched-rows-for-foreign-key

(请注意,答案是针对MySQL的,但T-SQL语法是相同的。)

在您的情况下,查询将如下所示:

SELECT p_desc FROM dbo.products AS P
 WHERE (NOT EXISTS (SELECT 1 FROM dbo.order_details AS OD WHERE OD.p_no = P.p_no));
相关问题