来自查询的SQL的SQL重复

时间:2013-06-28 12:20:20

标签: mysql sql

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

     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应该输出两次,不是吗?

3 个答案:

答案 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 JOINON连接条件)而不是隐式连接(逗号分隔表和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