这些是我创建的表并相应地插入了值:
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)
为了显示购买了所有 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)
但不幸的是,执行此查询后,它会显示所有客户名称。但我想显示购买了所有 DVD 的特定客户名称。
有人可以向我提供正确的查询吗?
您可以尝试以下方法:
说明:首先我们需要知道可用的 DVD 数量。
然后我们需要获取客户购买的不同DVD 的数量,并将其与我们之前获得的总数进行比较。
最后,我们只需要加入客户表来检索名称。
作为对作为关系划分形式的irimias解决方案的补充,另一个变体是使用存在和双重否定。从本质上讲,一个人想要实现的是:
然而,这在 SQL 中不受支持,但您可以使用等价:
在你的情况下,这将是:
customers, where it does not exist a DVD such that the customer did not purchase it:
根据我的经验,大多数人发现 irimias 解决方案更容易理解,所以你应该坚持下去。但是,查看其他解决方案可能会引起一些兴趣。
作为一个练习,对于一个一致的数据库(在 op 的示例中没有声明引用完整性),这两个查询返回相同的结果,除了在一种特殊情况下,那是什么情况?
输出:
其背后的想法是计算每个客户的 dvd 数量并将其与所有 dvd 匹配。
或者,您可以尝试使用窗口函数,如下所示:
检查总数是否与 dvd 表中的不同行总数匹配