【问题标题】:SQL inner join creates duplicatesSQL 内连接创建重复项
【发布时间】:2013-09-09 18:41:12
【问题描述】:

我有三个表格,供应商、产品和交付。我想显示交货表中的供应商名称和数量。有 5 家不同的供应商,有 12 次交货。我希望连接的表应该包含 12 行名称和交货。

这是我的代码。

SELECT  Suppliers.SNAME, Deliveries.QTY
FROM Suppliers, Deliveries
INNER JOIN  Products
ON Deliveries.P=Products.Penter (typo, should be Products.P)

输出是 60 行,其中包含许多重复项和一些不正确的匹配项。

表:

【问题讨论】:

  • 5x12 = 60,听起来您的 JOIN 可以使用其他标准。发布表结构/示例数据,我们可以确定它。
  • 您需要在 Suppliers 和其他两个表之间指定JOIN 条件。
  • 我认为您也必须定义供应商和交付之间的连接。由于您在示例中交叉加入了它们
  • 使用group by 这样就可以解决问题
  • 您正在使用 JOIN 关键字混合隐式连接(在 where 子句中)和显式连接。不要那样做。

标签: sql inner-join


【解决方案1】:

终止已弃用的隐式连接,并指定JOIN 条件,不确定您的表结构,例如:

SELECT  s.SNAME, d.QTY
FROM Deliveries d
INNER JOIN Suppliers s
 ON d.s = s.s
INNER JOIN  Products p
 ON d.p = p.p

一个未指定的隐式JOIN 即:

SELECT  Suppliers.SNAME, Deliveries.QTY
FROM Suppliers, Deliveries

将导致每个表中的每条记录都连接到另一个表中的每条记录,在您的情况下,5 条记录和 12 条记录 = 60 种组合。

【讨论】:

  • Suppliers 别名 p 应该是 s。会自己修复,但至少要修改 6 个字符。
【解决方案2】:

始终使用正确的连接语法。您将旧式连接(,where 子句中的条件)与正确的 ANSI join 语法混合在一起。

你的意思是这样的:

SELECT s.SNAME, d.QTY
FROM Suppliers s join
     Deliveries d
     d.SupplierId = s.SupplierId join
     Products p
     ON d.P = Products.Penter;

我正在创建 SuppliersDeliveries 之间的连接字段。而且,我只是猜测那些是需要连接的表(可能是SuppiersProducts)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 2022-01-02
    • 2017-07-31
    • 2023-03-04
    • 2012-06-18
    • 1970-01-01
    • 2015-01-05
    相关资源
    最近更新 更多