2013-10-21 6 views
0

我有以下表格:我需要根據不存在於另一個表的屬性從表中選擇

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 

項目表基本上是門店的庫存,告訴哪些產品每個店鋪都有在股票。我想列出所有不向數據庫中的任何商店提供任何產品的供應商。

這是我到目前爲止有:

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

您的任務描述不清楚。您可能想要發佈樣本數據和預期結果。同時指出您使用的RDBMS(SQL * flavor *)。 –

回答

0

由於商品顯示每個供應商在每個商店中的產品是否位於商品表中,因此它是您想要的商品。左連接將使這些空。只需檢查那些爲空的項目。就像這樣:

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

這兩個答案都在邏輯上是相同的,第一個用途加入,第二次查詢。

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表這樣的查詢。

+0

嗯,你確定左加入產品?我希望這是一個內部聯接。 – Hogan

+0

@霍根 - 內部聯接是否會過濾掉沒有產品的所有供應商? –

+0

沒錯,這是一個需求問題,我認爲OP不會對這個組感興趣......但是OP可能是,現在還不清楚。 – Hogan

相關問題