如何仅显示特定价格表中未包含的产品?

时间:2018-11-04 21:55:12

标签: sql sql-server

我有以下4张桌子:

create table Productgroup
(
    productgroup_id char(4) primary key,
    productgroupName varchar(25) not null
)

create table Product
(
    product_id char(4) primary key,
    productName varchar(25) not null,
    product_productgroup_id char(4) 
        constraint product_productgroup_id_foreign 
            foreign key references Productgroup(productgroup_id)
)

create table Pricelist
(
    pricelist_id char(4) primary key,
    pricelistName varchar(25) not null
)

create table Productprice
(
    productprice_id int identity(1000, 1) primary key,
    price int not null,
    discount decimal(10,2),
    product_productprice_id char(4) 
         constraint product_productprice_id_foreign 
             foreign key references Product(product_id),
    pricelist_productprice_id char(4) 
         constraint pricelist_productprice_id_foreign 
             foreign key references Pricelist(pricelist_id)
)

每个产品都有一个产品组,可以包含在具有不同价格的不同价格清单中。

到目前为止,我有2个价目表,一个价目表称为“商店”,一个价目表称为“星期五吧”。我想进行查询,以显示价格表“星期五酒吧”中未包含该产品的产品和产品组。

到目前为止,我有以下代码:

SELECT 
    Productgroup.productgroupName, Product.productName 
FROM 
    Product
JOIN 
    Productgroup ON Product.product_productgroup_id = Productgroup.productgroup_id
JOIN 
    Productprice ON Product.product_id = Productprice.product_productprice_id
JOIN 
    Pricelist ON Productprice.pricelist_productprice_id = Pricelist.pricelist_id
WHERE 
    Pricelist.pricelistName != 'Friday bar'

但是此查询的问题在于它同时显示了星期五栏中包含的产品和星期五栏中未包含的产品。但是,仅显示价格表“星期五酒吧”中的产品。但是应该只显示那些不在价目表“星期五栏”中的产品。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

是的,如果您加入,则无法将其排除在其他价目表中,因为每个价目表都会有一行。相反,您必须专门检查该价目表中的价格是否存在,例如

SELECT PG.productgroupName, P.productName
FROM Product P
INNER JOIN Productgroup PG ON P.product_productgroup_id = PG.productgroup_id
where not exists (
  select 1
  from Productprice PP
  inner join Pricelist PL ON PP.pricelist_productprice_id = PL.pricelist_id
  where P.product_id = PP.product_productprice_id
  and PL.pricelistName = 'Friday bar'
)

答案 1 :(得分:0)

您可以使用left join

SELECT Productgroup.productgroupName, Product.productName
    FROM Product JOIN
         Productgroup 
         ON Product.product_productgroup_id = Productgroup.productgroup_id JOIN
         Productprice
         ON Product.product_id = Productprice.product_productprice_id JOIN
         Pricelist
         ON Productprice.pricelist_productprice_id = Pricelist.pricelist_id AND
            Pricelist.pricelistName = 'Friday bar'
WHERE Pricelist.pricelist_id IS NULL;