0

假设公司名称和产品名称是它们关系中的主键,我不明白为什么公司名称不能在此查询中重复:

     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,对于两者,Product.name 是在计算的集合中,因此 S 应该输出两次,不是吗?

4

3 回答 3

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子句中的连接条件),因为它可以更清楚地准确地将表连接在一起。

于 2013-06-28T12:26:24.610 回答
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')
于 2013-06-28T12:29:07.240 回答
0

可以返回两个 S,因为您从返回公司和产品的查询中预测了公司名称,此查询的每一行都是唯一的,但是当您投影某些列时,它们可能不是唯一的,或者可以使用 DISTINCT

于 2013-06-28T12:48:00.100 回答