我在SQLPLUS中遇到了一个问题。
我被要求为满足以下约束条件的所有供应商显示SuppCode,SuppName和PostCode:他们提供的每个库存商品的价格都高于所有库存商品的平均价格。
我正在使用的三张桌子是; Supppliers and Stocks和SupplyItems。
供应商表看起来像:
SUPPCODE SUPPNAME STREET TOWN COUNTRY POSTCODE TELNO FAXNO
有8个单独的样本数据(8个供应商),没有空字段。
Stocks表格如下:
ITEMNO STORECODE ITEMDESC QUANTITY UNITS REORDER PRICE SUPPCODE
使用40个单独的样本数据(40个库存项目),并且没有空字段。
SupplyItems表如下所示:
SUPPCODE CATNO STOCKNO PRICE
使用60个单独的样本数据(60个供应项目),并且没有空字段。
我写了以下查询:
select distinct SU.SuppCode, Su.SuppName, PostCode
from Suppliers SU
LEFT JOIN SupplyItems SI ON SU.SuppCode = SI.SuppCode
where Price >
(select AVG(Quantity) from Stocks ST
where SI.StockNo = ST.StockNo);
我得到以下输出(4个值):
SUPPCODE SUPPNAME POSTCODE
S6 BSS LTD. B10 8SS
S2 ITX LTD. IT5 3TX
S3 FFG LTD. FY9 6FG
S4 OMM LTD. OM5 4MM
现在,我已经知道输出应该包含2或3条记录,所以我的查询是错误的,虽然我看不出原因。
任何帮助都将不胜感激。
答案 0 :(得分:1)
此:
where Price >
(select AVG(Quantity) from Stocks ST
看起来不对 - 不应该是
AVG(price)
编辑:也是,
select distinct SU.SuppCode, Su.SuppName, PostCode
from Suppliers SU
LEFT JOIN SupplyItems SI ON SU.SuppCode = SI.SuppCode
where Price > ...
可能不会做你想要的 - 这将返回所有提供至少一个项目的供应商,其价格高于平均水平;要获得仅提供 项目且价格高于平均值的供应商,您必须使用不同的方法,例如(另)
select distinct SU.SuppCode, Su.SuppName, PostCode
from Suppliers SU
where not exists (
select null from SupplyItems si
where su.SuppCode = si.SuppCode
and su.price <= (
select AVG(price) from Stocks ST
where SI.StockNo = ST.StockNo)
)