【问题标题】:SQL query: make a report for all productsSQL查询:为所有产品制作报表
【发布时间】:2019-07-07 20:10:25
【问题描述】:

我需要帮助来构建 SQL 查询。

我有 2 个表 PROJECT 和 PRODUCT,其中包含以下字段:

项目:

  • 项目代码
  • 项目名称

产品:

  • 项目代码
  • 项目名称
  • 项目代码
  • 替换代码

REPLACEDBYCODE 将包含其他 ITEMCODE(意味着该产品已被其他产品替换)。如果产品尚未被替换,则 REPLACEDBYCODE 的值为空白 ''。

我想为所有这样的产品制作报告:

ITEMCODE | ITEMNAME | REPLACEDBYCODE | **REPLACED_ITEM_NAME** | PROJECTNAME

【问题讨论】:

  • 用您正在使用的 RDBMS(例如 SQL Server、Oracle、Postgres、MySQL)标记您的问题。

标签: sql


【解决方案1】:

您需要通过外部连接将 PRODUCT 连接到自身。也就是说,查询将返回所有项目,并为那些有替换代码的项目显示新名称。

 select p1.itemcode
        , p1.itemname
        , p1.replacedbycode
        , p2.itemname replaced_item_name
from product p1
       left outer join product p2
          on p1.replacedbycode = p2.itemcode
/

注意:这是 ANSI 连接语法。某些类型的 RDBMS 可能具有用于外连接的替代语法,例如 Oracle pre-9i。

【讨论】:

    【解决方案2】:

    您可以将表连接到自身:

    SELECT p.itemcode, p.itemname, p.replacedbycode, r.itemname, j.projectname
    FROM product as p JOIN product as r ON(p.replacedbycode = r.itemcode)
                      JOIN project as j ON(p.projectcode = j.projectcode);
    

    如果您使用replacedbycode 的约定实际上是null 而不是空白,这是使用数据库的更惯用的方式,那么您可以使用COALESCE 打印一个漂亮的错误消息以防没有替代品项目:

    SELECT p.itemcode, p.itemname, p.replacedbycode, COALESCE(r.itemname, "no replacement"), j.projectname,
    FROM product as p LEFT JOIN product as r ON(p.replacedbycode = r.itemcode)
                      JOIN project as j ON(p.projectcode = j.projectcode);
    

    请注意,在第二种情况下,我使用左外连接来包含未指定替换的行。

    想一想,replacebycode 列应该对itemcode 列有一个外键约束,在这种情况下,您甚至不应该被允许将空字符串作为值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-22
      • 2020-05-16
      • 1970-01-01
      • 1970-01-01
      • 2017-10-30
      • 1970-01-01
      • 1970-01-01
      • 2011-03-28
      相关资源
      最近更新 更多