【问题标题】:SQL Inner Join 2 TablesSQL 内连接 2 个表
【发布时间】:2018-03-12 12:34:54
【问题描述】:

希望在这方面得到一些帮助,我尝试了一些内部联接,该内部联接显示产品表中的所有“产品”信息,任何使用内部联接已售出 10 件以上的产品。

PRODUCT TABLE (Columns)
P_CODE, P_DESCRIPT, P_INDATE, P_QOH, P_MIN, P_PRICE, P_DISCOUNT, V_CODE

LINE TABLE (Columns) this table shows the lines/information for each 
invoice

INV_NUMBER, LINE NUMBER, P_CODE, LINE_UNITS, LINE_PRICE, LINE_TOTAL

我知道我必须使用公共键属性 (p_code) 进行连接,但我不知道如何在内连接中求和。

这是我最近的尝试:

SELECT * PRODUCT FROM PRODUCT
INNER JOIN line
ON product.p_code = line.p_code
WHERE sum(line_units) >=10
AND line.p_code = product.p_code;

错误:靠近“产品”;语法错误

任何帮助将不胜感激, 谢谢。

【问题讨论】:

  • 应该读作 10> 而不是 10>= 很可能“来自产品”是多余的

标签: mysql join inner-join


【解决方案1】:

看起来您在SELECT 部分中有表名PRODUCTsum() 需要出现在 SELECT 部分以及末尾的额外 HAVING 子句中。

SELECT *, sum(line_units) as line_units_sum FROM product
INNER JOIN line ON product.p_code = line.p_code
WHERE line.p_code = product.p_code
HAVING line_units_sum >= 10

【讨论】:

  • 谢谢,修复了最初的错误,但现在我收到一个用于我的 sum 函数“错误:滥用聚合函数 sum()”
  • 对此感到抱歉 - 实际上模拟了表并在本地重新运行了查询。我更新了查询,所以它现在应该可以工作了。
  • 通过对您的查询进行一些修改,能够得到我想要的结果。添加在'group by product.p_code'中也从选择中删除*并手动输入我想要显示的产品属性,否则它显示来自产品和产品线的所有属性,我认为这是因为表现在都加入了结果在显示产品和产品线属性的选择语句中的“*”中? - 感谢约翰的帮助。
  • 是的,没错。由于 SELECT 中的 *,它会从两个表中提取所有字段。很高兴我能帮上忙!
【解决方案2】:

要求

显示product 表中已售出超过 10 件的任何产品的所有产品信息。

解决方案

因为您只想从product 表构建投影,而您不需要line 表中的任何列,您还可以使用如下相关子查询:

SELECT *
FROM product
WHERE 10 < (
    SELECT COUNT(*)
    FROM line
    WHERE line.p_code = product.p_code
)

如果 JOIN 的成本低于其他替代方案,则数据库优化器可能会选择在内部使用 JOIN。因此,这并不意味着查询将对外部表记录进行逐行处理。只有执行计划才能告诉数据库引擎是如何执行查询的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    • 2022-12-22
    • 2018-03-05
    • 1970-01-01
    相关资源
    最近更新 更多