Products
的表格p_no
和p_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
属性的,所以我假设这是错误的。
答案 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));