【发布时间】:2010-09-30 22:27:42
【问题描述】:
我有一个在 Access 中的数据库(你可以得到它link text)。如果我跑
SELECT DISTINCT Spl.Spl_No, Spl.Spl_Name
FROM Spl INNER JOIN Del
ON Spl.Spl_No = Del.Spl_No
WHERE Del.Item_Name <> 'Compass'
它提供了从未交付过指南针的供应商的名称。但是,您可以使用子查询来执行此操作。到目前为止,我自己和其他一些人都无法做到这一点。
我确实做到了以下几点,直到我们添加更多供应商然后它停止工作
SELECT SPL.SPL_Name
FROM SPL
LEFT JOIN DEL ON Del.SPL_No = SPL.SPL_No
WHERE (DEL.Item_Name<>"Compass") OR (DEL.Item_Name IS NULL)
GROUP BY SPL.SPL_Name
HAVING COUNT(DEL.SPL_No) = 0
所以问题是:这可能与子查询有关吗?
【问题讨论】:
-
既然已经将子查询作为连接,为什么还要使用子查询呢?顺便说一句,您给出的第二个示例没有使用子查询!
-
第一个示例不起作用 - 供应商可能已经交付了指南针,但只要他们还交付了其他东西,他们仍然会出现。
-
另外:供应商可能会出现多次:对于每种交付的非指南针类型的物品一次。
-
另外,第一个查询不会列出那些从未交付过任何东西的供应商 - 它只会列出那些交付过除指南针以外的东西的供应商(省略那些只交付过指南针的供应商,以及那些从未交付过任何东西)。