首先,让我们有点迂腐,考虑一下任务要求你做什么和你做了什么之间的区别。该任务要求您使用subselect,并使用main select查询
SalesLT.Product
以及子选择查询
SalesLT.SalesOrderDetail
。你没有按照任务指示去做,而是做了
join
。从技术上讲,你可以通过以下方式实现任务的目标
参加
同样,但您需要按照说明进行操作,如果要求您使用子查询,请这样做。
其次,你犯的逻辑错误是,当你加入时
SalesLt.Product
具有
销售LT。销售订单详细信息
,然后您将加入所有匹配,因此,如果您有一个产品售出了8次,那么您将获得8对,因此您将有8条与该产品对应的记录,而不是1条(请参阅
ProductID
例如876),如果你遵循指令并使用子查询,这将是结果。但是,为了实现同样的目标
参加
,你可以做
group by
也就是说,您将多个产品销售元组合并为单个记录,每个产品只有一个匹配项:
SELECT p.ProductID, p.Name, p.ListPrice
FROM SalesLT.Product p
JOIN SalesLT.SalesOrderDetail s ON p.ProductID = s.ProductID
WHERE p.ListPrice >= 100.00
AND s.UnitPrice < 100.00
GROUP BY p.ProductID, p.Name, p.ListPrice
ORDER BY ProductID;
第三,你的
参加
并且它们的子选择不是最优的,因为它们将搜索所有对而不是单个示例。
EXISTS
在子选择中搜索单个匹配项,如果找到匹配项,则停止搜索新的匹配项,而
IN
找到所有匹配项,因此需要更多时间,在我们的情况下,我们只对
存在
,所以:
SELECT ProductID, Name, ListPrice
FROM SalesLT.Product
WHERE EXISTS (SELECT SalesLT.SalesOrderDetail.ProductID
FROM SalesLT.SalesOrderDetail
WHERE UnitPrice < 100.00 AND SalesLT.SalesOrderDetail.ProductID = SalesLT.Product.ProductID)
AND ListPrice >= 100.00
ORDER BY ProductID;
第四,第一项任务尚未讨论。它看起来与他们的子选区有些相似:
SELECT ProductID, Name, ListPrice
FROM SalesLT.Product
WHERE ListPrice > (SELECT AVG(UnitPrice)
FROM SalesLT.SalesOrderDetail
WHERE SalesLT.Product.ProductID = SalesLT.SalesOrderDetail.ProductID)
ORDER BY ProductID;