我有以下表格:
VENDOR: PRODUCT: ITEM: STORE:
- VENDOR_ID - PRODUCT_ID - ITEM_ID - STORE_ID
- VENDOR_NAME - PRODUCT_DESC - STORE_ID - STORE_NAME
- VENDOR_ID - PRODUCT_ID - STORE_LOCATION
- ITEM_PRICE
ITEM表基本上是商店的库存,告诉每个商店库存的产品。我想列出所有不向数据库中的任何商店提供任何产品的供应商。
这是我到目前为止所做的:
SELECT DISTINCT VENDOR.VENDOR_NAME AS VENDORNAME
FROM VENDOR, PRODUCT, ITEM, STORE
WHERE NOT VENDOR.VENDOR_ID = PRODUCT.VENDOR_ID
AND NOT PRODUCT.PRODUCT_ID = ITEM.PRODUCT_ID
AND NOT ITEM.STORE_ID = STORE.STORE_ID;
现在,它返回所有供应商名称。您是否有任何想法会使其仅返回其产品不在任何商店的供应商?感谢。
答案 0 :(得分:0)
由于item显示了每个商店中每个商店的产品,如果产品不在item表中,那么它就是您想要的产品。左连接将保留null。只需检查那些为null的项目。像这样:
select *
from vendor v
join product p on v.vendor_id = p.product_id
left join item i on p.product_id = i.product_id
where i.product_id is null
OR
查找项目表中没有的所有产品。这忽略了供应商表:
select *
from product p
where product_id not in (select product_id from item)
现在找到那些供应商
select *
from vendor
where vendor_id in
(
select vendor_id
from product p
where product_id not in (select product_id from item)
)
这两个答案在逻辑上是相同的,第一个使用连接,第二个子查询。
答案 1 :(得分:0)
请试试这个:
SELECT MAX(v.VENDOR_NAME) AS VENDORNAME
FROM VENDOR v
LEFT JOIN PRODUCT p ON v.endor_id = p_vendor_id
LEFT JOIN ITEM i ON p_product_id = i.product_id
GROUP BY v.vendor_id
HAVING COUNT(i.item_id) = 0;
此类查询不需要 STORE
表。