我需要根据另一个表中不存在的属性从表中进行SELECT

时间:2013-10-21 02:18:11

标签: sql select distinct

我有以下表格:

   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;

现在,它返回所有供应商名称。您是否有任何想法会使其仅返回其产品不在任何商店的供应商?感谢。

2 个答案:

答案 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表。