【问题标题】:I need to SELECT from a table based on attributes not being present in another table我需要根据另一个表中不存在的属性从一个表中选择
【发布时间】:2013-10-21 02:18:11
【问题描述】:

我有以下表格:

   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;

现在,它返回所有供应商名称。你有什么想法可以让它只返回产品不在任何商店的供应商吗?谢谢。

【问题讨论】:

  • 您的任务描述不清楚。您可能想要发布示例数据和预期结果。还要指出您使用的 RDBMS(SQL flavor)。

标签: sql select distinct


【解决方案1】:

由于 item 会显示每个供应商在每个商店中的产品,如果产品不在 item 表中,那么它就是您想要的。左连接将使那些为空。只需检查那些为空的项目。像这样:

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

查找不在项目表中的所有产品。这忽略了供应商表:

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)
)

这两个答案在逻辑上是相同的,第一个使用连接,第二个使用子查询。

【讨论】:

    【解决方案2】:

    请试试这个:

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

    【讨论】:

    • 嗯,你确定要左连接到产品吗?我希望这是一个内部连接。
    • @Hogan - 内部连接不会过滤掉所有没有产品的供应商吗?
    • 没错,这是一个需求问题,我认为 OP 不会对该组感兴趣...但 OP 可能是,目前尚不清楚。
    猜你喜欢
    • 2015-03-28
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多