patternsqlMinor
SQL query to display names of customers who have purchased all the DVD
Viewed 0 times
theallsqlwhoquerydvdpurchasednamesdisplaycustomers
Problem
These are the tables I have created and inserted the values accordingly:
In order to display names of customers who have purchased all the DVD, this is the query that I have tried out:
But unfortunately, after executing this query it is displaying all the customer names. But I want to display a specific customer name who have purchased all the DVD.
Can someone provide me the correct query ?
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)In order to display names of customers who have purchased all the DVD, this is the query that I have tried out:
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)But unfortunately, after executing this query it is displaying all the customer names. But I want to display a specific customer name who have purchased all the DVD.
Can someone provide me the correct query ?
Solution
You can try something like:
Explaination: first we need to know the number of DVDs available.
Then we need to get the number of distinct DVDs purchased by the customers, and to compare it with the total we got previously.
And finally, we just need to join with customers table to retrieve the names.
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_NoExplaination: first we need to know the number of DVDs available.
select count(*)
from DVDThen we need to get the number of distinct DVDs purchased by the customers, and to compare it with the total we got previously.
select Customer_No
from DVD_Purchase
group by Customer_No
having count(distinct DVD_No) = And finally, we just need to join with customers table to retrieve the names.
Code Snippets
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_Noselect count(*)
from DVDselect Customer_No
from DVD_Purchase
group by Customer_No
having count(distinct DVD_No) = <number of DVDs available>Context
StackExchange Database Administrators Q#184469, answer score: 3
Revisions (0)
No revisions yet.