假设公司名称和产品名称是他们关系中的主键,我不明白为什么在此查询中不能重复该公司名称:
SELECT Company.name
FROM Company, Product
WHERE Company.name=Product.maker
AND Product.name IN
(SELECT Purchase.product
FROM Purchase
WHERE Purchase.buyer = ‘Joe Blow‘);
如果S公司制造了两个产品X,Y,Joe Blow同时购买了它们,那么在开始时我们会为条件“Company.name = Product.maker”制作笛卡尔产品:SX,SY和两者,产品.name是在计算的集合中,因此S应该输出两次,不是吗?
答案 0 :(得分:1)
如果没有看到你的表格结构或错误信息,我无法确定是什么问题。您的语法似乎是正确的。
但是,使用更好的连接可以改善您的查询:
SELECT
c.name
FROM
Company c
INNER JOIN Product prod
ON c.name = prod.maker
INNER JOIN Purchase pch
ON prod.name = pch.product
WHERE
pch.buyer = 'Joe Blow'
我建议使用显式连接(INNER JOIN
和ON
连接条件)而不是隐式连接(逗号分隔表和WHERE
子句中的连接条件),因为它使它成为可能更清楚地了解表格如何连接在一起。
答案 1 :(得分:1)
我会说,在大多数RDBMS中,您的查询将返回两个'S'。
你可以在SQL FIDDLE
自己尝试一下你可以把distinct放在没有重复的地方
SELECT distinct Company.name
FROM Company, Product
WHERE Company.name=Product.maker
AND Product.name IN
(SELECT Purchase.product
FROM Purchase
WHERE Purchase.buyer = 'Joe Blow')
答案 2 :(得分:0)
返回两个S是可以的,因为您从返回公司和产品的查询中预测公司名称,此查询的每一行都是唯一的,但是当您投影某些列时,它们可能不是唯一的,或者可以使用DISTINCT