2013-10-09 30 views
2
  • 有一张表Productsp_nop_desc
  • 有一个表order_detailsp_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属性,所以我假设这是错误的。

+0

http://technet.microsoft.com/en-us/library/ms188055.aspx – Johan

+0

来自任何来源(包括作业)的问题都欢迎Stack Overflow,只要它们满足所有问题的标准(清晰,简洁,代码重现问题,尝试解决方案和研究等)。没必要提及它的作业,实际上,尽量不要将它作为一个伟大的编程问题(对其他没有你的具体任务的人也有用)来自己去确定问题它符合提到的标准。 – Jeroen

回答

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)); 
+0

这不是一个答案。它应该是一个评论。 OP询问“EXCEPT如何工作”。 – Johan

+0

非常感谢!请问第二选择中“1”的功能是什么? –

+0

尽管你对自己的知识有(似乎没有根据的)信念,但远不是“最干净”的解决方案,这很可能是最糟糕的。请参阅@ Johan的答案,以获得大多数人认为最干净的解决方案。 – Bohemian

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 not in order_details.p_no

看起来像语法错误。

//最后,
从产品
选择p_desc在哪里(从ORDER_DETAILS p_no不在(选择p_no))

看起来不错,我觉得这是一个最容易理解的。

微软EXCEPT
备注虽然我可以看到易用性的说法,使用这样的代码,这将使它很难你的代码移植到另一个平台。
我建议尽量靠近SQL-92的核心,并在上一条语句中使用该表单。
它会让你成为一个更全面的程序员,并防止锁定到一个单一的平台上,就职前景而言,这只能是一件好事。

从功能的角度来看,代码样本A对样本C没有任何好处,它们都需要花费相同的时间来运行。