lea*_*gIT 5 sql-server relational-division
这些是我创建的表并相应地插入了值:
CREATE TABLE Customer
(Customer_No INTEGER IDENTITY (1,1) PRIMARY KEY,
Customer_Name VARCHAR(30) NOT NULL
)
CREATE TABLE DVD
(DVD_No INTEGER IDENTITY (1,1) PRIMARY KEY,
DVD_Name VARCHAR(30)
)
CREATE TABLE DVD_Purchase
(DVD_Purchase_No INTEGER IDENTITY (1,1) PRIMARY KEY,
DVD_No INTEGER NOT NULL,
Customer_No INTEGER NOT NULL
)
INSERT INTO Customer (Customer_Name)
VALUES('Daman')
INSERT INTO Customer (Customer_Name)
VALUES('Saif')
INSERT INTO Customer (Customer_Name)
VALUES('Gurung')
INSERT INTO Customer (Customer_Name)
VALUES('Upendra')
INSERT INTO DVD (DVD_Name)
VALUES('Bleach')
INSERT INTO DVD (DVD_Name)
VALUES('Gintama')
INSERT INTO DVD (DVD_Name)
VALUES('Tokyo Ghoul')
INSERT INTO DVD (DVD_Name)
VALUES('Death Note')
INSERT INTO DVD_Purchase (DVD_No,Customer_No)
VALUES (4,1)
INSERT INTO DVD_Purchase (DVD_No,Customer_No)
VALUES (1,2)
INSERT INTO DVD_Purchase (DVD_No,Customer_No)
VALUES (1,3)
INSERT INTO DVD_Purchase (DVD_No,Customer_No)
VALUES (2,3)
INSERT INTO DVD_Purchase (DVD_No,Customer_No)
VALUES (3,3)
INSERT INTO DVD_Purchase (DVD_No,Customer_No)
VALUES (4,3)
INSERT INTO DVD_Purchase (DVD_No,Customer_No)
VALUES (1,4)
INSERT INTO DVD_Purchase (DVD_No,Customer_No)
VALUES (2,4)
Run Code Online (Sandbox Code Playgroud)
为了显示购买了所有 DVD 的客户的姓名,这是我尝试过的查询:
SELECT Customer_Name
FROM Customer
WHERE
EXISTS (SELECT Customer_Name,DVD_Name
FROM Customer,DVD,DVD_Purchase
WHERE Customer.Customer_No = DVD_Purchase.Customer_No AND DVD.DVD_No = DVD_Purchase.DVD_No)
Run Code Online (Sandbox Code Playgroud)
但不幸的是,在执行此查询后,它会显示所有客户姓名。但我想显示购买了所有 DVD 的特定客户名称。
有人可以为我提供正确的查询吗?
你可以尝试这样的事情:
select c.Customer_Name
from Customer c
join ( select Customer_No
from DVD_Purchase
group by Customer_No
having count(distinct DVD_No) = (select count(*) from DVD)
) d on c.Customer_No = d.Customer_No
Run Code Online (Sandbox Code Playgroud)
说明:首先我们需要知道可用的 DVD 数量。
select count(*)
from DVD
Run Code Online (Sandbox Code Playgroud)
然后我们需要获取客户购买的不同DVD的数量,并将其与我们之前获得的总数进行比较。
select Customer_No
from DVD_Purchase
group by Customer_No
having count(distinct DVD_No) = <number of DVDs available>
Run Code Online (Sandbox Code Playgroud)
最后,我们只需要连接客户表来检索姓名。