2
  • 有一张桌子Productsp_nop_desc
  • 有一张表order_detailsp_no同上)。

我需要p_descwhere products.p_nois not in 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属性的,所以我假设这是错误的。

4

2 回答 2

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

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

这看起来像语法错误。

// 最后,
从 products
where (p_no not in (select p_no from order_details)) 中选择 p_desc

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

关于微软的评论EXCEPT
虽然我可以看到易用性论点,但使用这样的代码会使您的代码很难移植到另一个平台。
我建议更接近 SQL-92 的核心,并在最后一条语句中使用这种形式。
它会让你成为一个更全面的程序员,并防止锁定在单一平台上,这对工作前景而言只能是一件好事。

从功能的角度来看,代码示例 A 与示例 C 相比没有任何优势,两者运行时间相同。

于 2013-10-09T20:54:24.667 回答
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));
于 2013-10-09T20:54:08.257 回答